Как в Java упаковываются и разворачиваются приложения
JAR – это обычная Java-программа, WAR – веб-приложение, EAR – крупный корпоративный проект, а JMOD – новый формат для модулей Java.
Процесс сборки и деплоя:
⏩ Compile – компиляция исходного кода в байт-код (файлы .class).
⏩ Package – упаковка файлов в один из архивов (JAR, WAR, EAR, JMOD).
⏩ Deploy – развёртывание на сервере или в среде выполнения.
👉 Java Portal
JAR – это обычная Java-программа, WAR – веб-приложение, EAR – крупный корпоративный проект, а JMOD – новый формат для модулей Java.
Процесс сборки и деплоя:
Please open Telegram to view this post
VIEW IN TELEGRAM
Модель памяти Java
Модель памяти Java (JMM) определяет, как потоки взаимодействуют через память, обеспечивая согласованность и синхронизацию. Она регулирует работу с
В многопоточных приложениях важно понимать, как потоки взаимодействуют с памятью, чтобы избежать ошибок, связанных с кэшированием и синхронизацией.
На графике показано, как
✅ Если запись идет в основную память (Main Memory), данные становятся видимыми для других потоков, предотвращая проблемы.
✅ Happens-Before Relationship обеспечивает порядок выполнения операций, гарантируя корректную работу программы.
⚠️ Без синхронизации возможны гонки данных и некорректное поведение. Используйте
👉 Java Portal
Модель памяти Java (JMM) определяет, как потоки взаимодействуют через память, обеспечивая согласованность и синхронизацию. Она регулирует работу с
volatile
переменными, атомарными операциями и отношением happens-before, предотвращая проблемы конкурентного выполнения.В многопоточных приложениях важно понимать, как потоки взаимодействуют с памятью, чтобы избежать ошибок, связанных с кэшированием и синхронизацией.
На графике показано, как
Thread 1
записывает данные. Без синхронизации они могут попасть в локальный кэш, из-за чего Thread 2
может получить устаревшие данныеvolatile, synchronized
или Lock
для безопасной работы с потоками.Please open Telegram to view this post
VIEW IN TELEGRAM
Каковы различия между StringBuilder и StringBuffer в Java?
StringBuffer:
⏩ Каждый метод синхронизирован.
⏩ Объект StringBuffer потокобезопасен, так как к нему может обращаться только один поток за раз.
⏩ Относительно низкая производительность.
⏩ Введён в версии 1.0.
StringBuilder:
⏩ Методы не синхронизированы.
⏩ StringBuilder не является потокобезопасным, так как к нему могут обращаться несколько потоков одновременно.
⏩ Относительно высокая производительность по сравнению с StringBuffer.
⏩ Введён в версии 1.5.
👉 Java Portal
StringBuffer:
StringBuilder:
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Недавно наткнулся на плагин, который сразу заставил IntelliJ IDEA смотреться как миллион баксов — Atom Material Icons. 💵
Если ты тоже хочешь, чтобы интерфейс был не только удобным, но и приятнее — пользуйся
Навигация по проекту становится в 10 раз быстрее — всё благодаря иконкам
👉 Java Portal
Если ты тоже хочешь, чтобы интерфейс был не только удобным, но и приятнее — пользуйся
Навигация по проекту становится в 10 раз быстрее — всё благодаря иконкам
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Опа, а вот и ещё одна годная штука
DZone Java — это такой хаб для джавистов, где собираются статьи, гайды, туториалы, обзоры и инсайды из мира Java. Причём не абы какие, а от разработчиков, архитекторов и простозадр... знатоков своего дела 😎
Можно подписаться на темы, собирать коллекции, шарить статьи в команду и не выпадать из инфополя
Лайк — если давно знаешь
👉 Java Portal
DZone Java — это такой хаб для джавистов, где собираются статьи, гайды, туториалы, обзоры и инсайды из мира Java. Причём не абы какие, а от разработчиков, архитекторов и просто
Можно подписаться на темы, собирать коллекции, шарить статьи в команду и не выпадать из инфополя
Лайк — если давно знаешь
Please open Telegram to view this post
VIEW IN TELEGRAM
Общие вопросы для собеседования на Java Spring Boot с ответами
1. Каково назначение аннотации
⏩
который автоматически настраивает Spring-приложение на основе зависимостей, присутствующих в classpath.
2. Каково назначение аннотации
⏩
и позволяя тестировать приложение целиком.
3. Как развернуть Spring Boot-приложение?
⏩ Вы можете развернуть Spring Boot-приложение как автономный JAR, WAR или используя платформы оркестрации контейнеров,
такие как Kubernetes и Docker.
4. Каково назначение аннотации
⏩
что позволяет использовать типобезопасную конфигурацию.
5. Как вы обрабатываете логирование в Spring Boot?
⏩ Spring Boot использует SLF4J как фасад логирования и поддерживает различные фреймворки логирования, такие как Logback, Log4j2 и Java Util Logging. Вы можете настроить логирование в
6. Каково назначение аннотации
⏩
таких как наличие класса или свойства.
7. Как создать RESTful веб-сервис с использованием Spring Boot?
⏩ Вы можете создать RESTful веб-сервис, определив класс с аннотацией
8. Каково назначение аннотации
⏩
источников в Spring-бины.
9. Как настроить пользовательский баннер в Spring Boot?
⏩ Вы можете настроить пользовательский баннер, разместив файл
или установив свойство
10. Каково назначение аннотации
⏩
позволяя использовать специфичные для среды конфигурации.
👉 Java Portal
1. Каково назначение аннотации
@EnableAutoConfiguration
?@EnableAutoConfiguration
включает механизм автоконфигурации Spring Boot,который автоматически настраивает Spring-приложение на основе зависимостей, присутствующих в classpath.
2. Каково назначение аннотации
@SpringBootTest
?@SpringBootTest
используется для интеграционного тестирования, загружая полный контекст приложенияи позволяя тестировать приложение целиком.
3. Как развернуть Spring Boot-приложение?
такие как Kubernetes и Docker.
4. Каково назначение аннотации
@ConfigurationProperties
?@ConfigurationProperties
используется для привязки внешних конфигурационных свойств к Java-объектам,что позволяет использовать типобезопасную конфигурацию.
5. Как вы обрабатываете логирование в Spring Boot?
application.properties
6. Каково назначение аннотации
@Conditional
?@Conditional
используется для условного включения или отключения бинов на основе определённых условий,таких как наличие класса или свойства.
7. Как создать RESTful веб-сервис с использованием Spring Boot?
@RestController
, отображая HTTP-запросы на методы обработчиков с использованием аннотаций @RequestMapping
или других аннотаций сопоставления запросов.8. Каково назначение аннотации
@Value
?@Value
используется для внедрения значений из файлов свойств, переменных среды или другихисточников в Spring-бины.
9. Как настроить пользовательский баннер в Spring Boot?
banner.txt
в каталоге src/main/resources
,или установив свойство
spring.banner.location
10. Каково назначение аннотации
@Profile
?@Profile
используется для условного включения или отключения бинов на основе активных профилей,позволяя использовать специфичные для среды конфигурации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое циклическая зависимость и как её следует решать?
Когда
Циклическая зависимость может возникать и между более чем двумя бинами, например:👇
beanA => beanB => beanC => beanD => beanA
Spring создаёт бины в том порядке, в котором они требуются. Если бин имеет зависимость, то сначала создаётся зависимость, а затем она внедряется для завершения создания бина.
В случае циклической зависимости Spring не может определить, какой бин создать первым.
Проблема циклической зависимости возникает при использовании конструкторной инъекции, так как бины создаются при загрузке контекста. При использовании setter-инъекции или инъекции в поле бины создаются, но их зависимости внедряются только по мере необходимости.
Таким образом, можно избежать проблемы циклической зависимости.☺️
При использовании конструкторной инъекции можно применить аннотацию
👉 Java Portal
Когда
beanA
зависит от beanB
, а beanB
зависит от beanA
, возникает циклическая зависимость. В этом случае оба бина пытаются внедрить друг друга через конструктор, и Spring выбрасывает исключение BeanCurrentlyInCreationException
Циклическая зависимость может возникать и между более чем двумя бинами, например:
beanA => beanB => beanC => beanD => beanA
Spring создаёт бины в том порядке, в котором они требуются. Если бин имеет зависимость, то сначала создаётся зависимость, а затем она внедряется для завершения создания бина.
В случае циклической зависимости Spring не может определить, какой бин создать первым.
Проблема циклической зависимости возникает при использовании конструкторной инъекции, так как бины создаются при загрузке контекста. При использовании setter-инъекции или инъекции в поле бины создаются, но их зависимости внедряются только по мере необходимости.
Таким образом, можно избежать проблемы циклической зависимости.
При использовании конструкторной инъекции можно применить аннотацию
@Lazy
. Это сообщает Spring, что при инициализации бина нужно внедрить прокси. Сам бин будет полностью создан только тогда, когда он действительно понадобится.Please open Telegram to view this post
VIEW IN TELEGRAM
Пирамида тестирования Java
1. Unit-тесты (JUnit, Mockito) — проверяют отдельные методы и классы.
☑ Самые быстрые
☑ Легко писать
☑ Ловят баги на старте
Пиши как можно больше
2. Integration-тесты (Testcontainers) — тестируют взаимодействие между модулями (например, сервис <-> база).
☑ Работают с реальными зависимостями
☑ Помогают избежать сюрпризов на проде
3. API-тесты (Postman, RestAssured) — проверяют REST-эндпоинты.
☑ Тесты бизнес-логики
☑ Можно автоматизировать или делать вручную
5. UI-тесты (Selenium) — имитируют действия пользователя.
⚠️ Медленные
⚠️ Ломаются чаще
Используй по минимуму, только для самых важных сценариев
👉 Java Portal
1. Unit-тесты (JUnit, Mockito) — проверяют отдельные методы и классы.
Пиши как можно больше
2. Integration-тесты (Testcontainers) — тестируют взаимодействие между модулями (например, сервис <-> база).
3. API-тесты (Postman, RestAssured) — проверяют REST-эндпоинты.
5. UI-тесты (Selenium) — имитируют действия пользователя.
Используй по минимуму, только для самых важных сценариев
Please open Telegram to view this post
VIEW IN TELEGRAM
Средства мониторинга производительности JVM
1. jconsole — простенький GUI, показывает метрики памяти, CPU, потоки, MBeans. Быстро подключиться и посмотреть.
2. jvisualvm — визуальный профайлер. Анализ CPU, heap, GC, лики, дампы. Идеален для локальной отладки.
3. Java Mission Control + JFR — мощный инструмент с минимальной нагрузкой. Можно писать flight recording даже в проде без ощутимых тормозов.
4. jstack — thread dump, ищем deadlock’и и зависания. Один из самых надёжных способов понять, на чём подвисли потоки
5. jmap — снимает heap dump, показывает гистограмму объектов. Полезно при утечках памяти.
6. jstat — real-time метрики по GC, perm/metaspace, загрузке классов. Можно воткнуть в watch и следить.
7. jcmd — самый универсальный. Делает всё: heap dump, thread dump, управление JFR, GC, diagnostics.
👉 Java Portal
1. jconsole — простенький GUI, показывает метрики памяти, CPU, потоки, MBeans. Быстро подключиться и посмотреть.
2. jvisualvm — визуальный профайлер. Анализ CPU, heap, GC, лики, дампы. Идеален для локальной отладки.
3. Java Mission Control + JFR — мощный инструмент с минимальной нагрузкой. Можно писать flight recording даже в проде без ощутимых тормозов.
4. jstack — thread dump, ищем deadlock’и и зависания. Один из самых надёжных способов понять, на чём подвисли потоки
5. jmap — снимает heap dump, показывает гистограмму объектов. Полезно при утечках памяти.
6. jstat — real-time метрики по GC, perm/metaspace, загрузке классов. Можно воткнуть в watch и следить.
7. jcmd — самый универсальный. Делает всё: heap dump, thread dump, управление JFR, GC, diagnostics.
Please open Telegram to view this post
VIEW IN TELEGRAM
Графовые алгоритмы — шпаргалка для Java Developer
Сводная таблица по всем основным алгоритмам на графах: обход, кратчайшие пути, минимальные остовные деревья, циклы, топология, компоненты связности и продвинутые техники
👉 Java Portal
Сводная таблица по всем основным алгоритмам на графах: обход, кратчайшие пути, минимальные остовные деревья, циклы, топология, компоненты связности и продвинутые техники
Please open Telegram to view this post
VIEW IN TELEGRAM
5 лучших задач на бинарные деревья для практики:
1. Обход в постфиксе (PostOrder) – https://bit.ly/3SdwWUd
2. Обход в префиксе (PreOrder) – https://bit.ly/3SbR4WL
3. Обход в инфиксе (InOrder) – https://bit.ly/3xUEsMf
4. Вывод всех листьев (Print leaf) – https://bit.ly/3BnrJCE
5. Уровень с максимальной суммой (Max sum level) – https://bit.ly/3qNv8FS
Отличная тренировка для собесов и укрепления понимания структур данных!🚘
👉 Java Portal
1. Обход в постфиксе (PostOrder) – https://bit.ly/3SdwWUd
2. Обход в префиксе (PreOrder) – https://bit.ly/3SbR4WL
3. Обход в инфиксе (InOrder) – https://bit.ly/3xUEsMf
4. Вывод всех листьев (Print leaf) – https://bit.ly/3BnrJCE
5. Уровень с максимальной суммой (Max sum level) – https://bit.ly/3qNv8FS
Отличная тренировка для собесов и укрепления понимания структур данных!
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое монолитная архитектура?
Монолитная архитектура — это единый унифицированный блок, где все компоненты приложения — от пользовательского интерфейса до бизнес-логики и доступа к данным — тесно интегрированы и разворачиваются вместе.
- Единый разворачиваемый модуль (обычно WAR или JAR файл)
- Общая память, база данных и кодовая база
- Проще в разработке и тестировании на ранних этапах
- Со временем может стать сложной и жёстко связанной
☑ Плюсы
- Удобна для небольших команд
- Меньше накладных расходов при разработке и деплое
- Прямая и понятная отладка
❌ Минусы
- Сложнее масштабировать отдельные компоненты
- Длительное время развёртывания (для крупных проектов)
- Трудно управлять при работе больших команд
👉 Java Portal
Монолитная архитектура — это единый унифицированный блок, где все компоненты приложения — от пользовательского интерфейса до бизнес-логики и доступа к данным — тесно интегрированы и разворачиваются вместе.
- Единый разворачиваемый модуль (обычно WAR или JAR файл)
- Общая память, база данных и кодовая база
- Проще в разработке и тестировании на ранних этапах
- Со временем может стать сложной и жёстко связанной
- Удобна для небольших команд
- Меньше накладных расходов при разработке и деплое
- Прямая и понятная отладка
- Сложнее масштабировать отдельные компоненты
- Длительное время развёртывания (для крупных проектов)
- Трудно управлять при работе больших команд
Please open Telegram to view this post
VIEW IN TELEGRAM
Особенности и ограничения Java Records
Особенности Java Records:
⏩ Снижение шаблонного кода — Нет необходимости вручную писать конструкторы,
геттеры,
⏩ Неизменяемы по умолчанию — все поля являются final
⏩ Эффективны по памяти — JVM оптимизирует выделение памяти.
⏩ Без дополнительных зависимостей — являются частью Java с версии 14
⏩ Инкапсуляция — данные хорошо структурированы и неизменяемы.
Ограничения Java Records:
⏩ Нет сеттеров — поля final и не могут быть изменены
⏩ Нельзя расширять классы — Records неявно являются final и не могут наследоваться от других классов.
⏩ Ограниченная настройка — не поддерживают аннотации вроде
👉 Java Portal
Особенности Java Records:
геттеры,
equals(), hashCode() и toString()
Ограничения Java Records:
@JsonIgnore
для полейPlease open Telegram to view this post
VIEW IN TELEGRAM
getDepartmentDeptName()
получает deptName
из связанной сущности Department
Please open Telegram to view this post
VIEW IN TELEGRAM
Понятие ошибки и исключения в Java
⏩ Error в Java — это серьёзная проблема, с которой программа не должна пытаться справляться. Обычно Error выбрасывается виртуальной машиной Java (JVM) и сигнализирует о неполадках, находящихся вне контроля программы, например, утечка памяти или переполнение стека
⏩ Exception в Java — это ситуация, которую программа может предусмотреть и обработать. Это ошибки, от которых можно восстановиться во время выполнения, используя конструкции обработки исключений, такие как
👉 Java Portal
try-catch
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Миграция от монолита к микросервисам в Spring Boot Java
⏩ Определите границы контекста —> используйте Domain-Driven Design (DDD) для логического разделения модулей
⏩ Модульность внутри приложения —> применяйте модули и пакеты Spring для изоляции сервисов
⏩ Вынос в микросервисы —> начинайте перенос модулей (например, пользователь, заказы) в отдельные сервисы
⏩ Внедрение API Gateway и сервис-дискавери —> используйте Spring Cloud Gateway и Eureka/Nacos
⏩ Безопасность взаимодействия —> добавьте уровни безопасности OAuth2/JWT
⏩ CI/CD пайплайн —> автоматизируйте сборку, тестирование и деплой с помощью Jenkins/GitHub Actions
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Уровни доступа при наследовании
Подкласс:
private —> Не видно в подклассе
default —> Видно, если в одном пакете
protected —> Видно в подклассе
public —> Видно в подклассе
👉 Java Portal
Подкласс:
private —> Не видно в подклассе
default —> Видно, если в одном пакете
protected —> Видно в подклассе
public —> Видно в подклассе
Please open Telegram to view this post
VIEW IN TELEGRAM
Нужен быстрый генератор OTP в Java?
Вот сниппет, который создаёт случайный 4-значный код с помощью
Идеально подойдёт для логина, регистрации или проверки пользователя
👉 Java Portal
Вот сниппет, который создаёт случайный 4-значный код с помощью
Random
и String.format()
Идеально подойдёт для логина, регистрации или проверки пользователя
Please open Telegram to view this post
VIEW IN TELEGRAM
Мягкое завершение работы Spring Boot приложения
1. Прекратить приём новых запросов
—> Приложение прекращает принимать новые входящие запросы.
2. Дать текущим запросам завершиться
—> Текущим запросам разрешается завершиться
3. Завершить внутренние задачи
—> Внутренние задачи, такие как запланированные задания, завершаются.
4. Оповестить другие сервисы
—> Приложение уведомляет другие сервисы о подготовке к завершению работы.
👉 Java Portal
1. Прекратить приём новых запросов
—> Приложение прекращает принимать новые входящие запросы.
2. Дать текущим запросам завершиться
—> Текущим запросам разрешается завершиться
3. Завершить внутренние задачи
—> Внутренние задачи, такие как запланированные задания, завершаются.
4. Оповестить другие сервисы
—> Приложение уведомляет другие сервисы о подготовке к завершению работы.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Быстрее находите и устраняйте ошибки в коде с IntelliJIDEA 👩💻
Используйте
Куда бы ни был установлен курсор, IDE сразу перенесёт вас к проблеме с полезными объяснениями и предложениями по быстрому исправлению
👉 Java Portal
Используйте
⇧F2
(macOS) / Shift + F2
(Windows, Linux), чтобы переходить между проблемами.Куда бы ни был установлен курсор, IDE сразу перенесёт вас к проблеме с полезными объяснениями и предложениями по быстрому исправлению
Please open Telegram to view this post
VIEW IN TELEGRAM