Есть один отличный фреймворк — Javalin
Если нужно быстро запустить сервер или сделать небольшое приложение — самое то
Он позволяет настроить сервер легко и без лишних зависимостей. Все, что нужно для REST API или WebSocket — уже встроено.
ℹ️ Идеально для пет-проектов, микросервисов и прототипов
👉 Java Portal
Если нужно быстро запустить сервер или сделать небольшое приложение — самое то
Он позволяет настроить сервер легко и без лишних зависимостей. Все, что нужно для REST API или WebSocket — уже встроено.
Please open Telegram to view this post
VIEW IN TELEGRAM
Разница между агрегацией, ассоциацией и композицией в Java
Ассоциация
Общая связь между двумя классами, где объекты одного класса связаны с объектами другого, но нет владения или строгой зависимости.
Пример:
⏩ Студент и Курс.
⏩ Студент может записаться на курс, но оба могут существовать независимо друг от друга.
Агрегация
Частный случай ассоциации, представляющий отношение "имеет-а" с концепцией "целое-часть", но части могут существовать независимо от целого.
Пример:
⏩ Автомобиль и его Колесо.
⏩ Автомобиль имеет колеса, но если автомобиль уничтожен, колеса могут существовать отдельно или быть использованы где-то еще.
Композиция
Более сильная форма агрегации, где "часть" полностью принадлежит "целому" и не может существовать без него.
Пример:
⏩ Дом и его Комната.
⏩ Если дом будет снесен, комнаты перестанут существовать.
👉 Java Portal
Ассоциация
Общая связь между двумя классами, где объекты одного класса связаны с объектами другого, но нет владения или строгой зависимости.
Пример:
Агрегация
Частный случай ассоциации, представляющий отношение "имеет-а" с концепцией "целое-часть", но части могут существовать независимо от целого.
Пример:
Композиция
Более сильная форма агрегации, где "часть" полностью принадлежит "целому" и не может существовать без него.
Пример:
Please open Telegram to view this post
VIEW IN TELEGRAM
Как работает Java? Понимание архитектуры языка
Когда мы пишем код на Java, он проходит несколько ключевых этапов перед тем, как стать работающей программой. Вот как это происходит:
🍩 Написав программу, мы получаем исходный код в файле
🍩 Этот код компилируется с помощью компилятора javac, который преобразует его в байт-код (.class). Это промежуточный формат, который понимает только JVM.
🍩 JVM берет этот байт-код и запускает его, выполняя программу.
Внутри JVM происходит:
- Загрузка классов с помощью
- Управление памятью: разделение на Stack, Heap и Method Area.
- Оптимизация с помощью JIT-компилятора, который превращает байт-код в машинный код для ускорения работы программы.
👉 Java Portal
Когда мы пишем код на Java, он проходит несколько ключевых этапов перед тем, как стать работающей программой. Вот как это происходит:
.java
.Внутри JVM происходит:
- Загрузка классов с помощью
ClassLoader
.- Управление памятью: разделение на Stack, Heap и Method Area.
- Оптимизация с помощью JIT-компилятора, который превращает байт-код в машинный код для ускорения работы программы.
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Проверка версии Docker
2. Работа с образами
3. Запуск Java-приложения в контейнере
4. Сборка и запуск контейнера с Java Spring Boot
5. Управление контейнерами
6. Сетевое взаимодействие в Docker
7. Docker Compose (Java + MySQL)
8. Docker Volumes (персистентные данные)
9. Очистка Docker
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое грациозное завершение работы Spring Boot-приложения?
🟡 Приложение перестаёт принимать новые входящие запросы.
🟡 Запросы, которые уже обрабатываются, получают возможность завершиться. Для других внутренних задач, таких как запланированные задания или обработка сообщений из очереди (MQ), приложение обеспечивает завершение текущих операций и предотвращает запуск новых.
🟡 Перед завершением работы приложение сигнализирует другим сервисам о предстоящем отключении, обеспечивая бесперебойность работы всей системы.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Как инициализируется класс в Java?
Когда JVM загружает класс, его инициализация происходит в строгом порядке:
🍩 сначала инициализируются все
🍩 затем выполняются статические блоки
🍩 после этого инициализируются обычные переменные объекта.
🍩 в конце выполняются конструкторы класса.
Этот порядок важен, так как попытка использовать переменную до её инициализации может привести к ошибке.
👉 Java Portal
Когда JVM загружает класс, его инициализация происходит в строгом порядке:
static
переменные. static { ... }
.Этот порядок важен, так как попытка использовать переменную до её инициализации может привести к ошибке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Архитектура Struts MVC
Struts — это Java-фреймворк, основанный на MVC, который разделяет приложение на модель, представление и контроллер, обеспечивая лучшую поддерживаемость и масштабируемость.
Всё просто:
Пользователь отправляет запрос → ActionServlet принимает и направляет запрос в соответствующий Action-класс → Action-класс обрабатывает запрос и передает его Model (бизнес-логике, DAO, сервисам) → Model получает данные из БД (через Hibernate, JDBC или EJB) → Model передает обработанные данные обратно в Action-класс → Action-класс передает данные View (JSP, Tiles) → View отображает данные пользователю.
В целом, его поток данных соответствует классической MVC-модели, но с улучшениями
👉 Java Portal
Struts — это Java-фреймворк, основанный на MVC, который разделяет приложение на модель, представление и контроллер, обеспечивая лучшую поддерживаемость и масштабируемость.
Всё просто:
Пользователь отправляет запрос → ActionServlet принимает и направляет запрос в соответствующий Action-класс → Action-класс обрабатывает запрос и передает его Model (бизнес-логике, DAO, сервисам) → Model получает данные из БД (через Hibernate, JDBC или EJB) → Model передает обработанные данные обратно в Action-класс → Action-класс передает данные View (JSP, Tiles) → View отображает данные пользователю.
В целом, его поток данных соответствует классической MVC-модели, но с улучшениями
Please open Telegram to view this post
VIEW IN TELEGRAM
Бруно Соуса про Java
"Netflix полностью работает на Java. Всё, что мы создаем, построено на Java."™️
Java не идеальна — да и никакой язык не идеален.
Но она существует уже десятилетия и используется в самых разных сферах, от банковских систем до корпоративных приложений, которые действительно поддерживают работу всего мира.
Она не яркая, не «крутая» новинка, но работает. А в мире технологий вещи, которые работают, часто остаются на долгие годы.
👉 Java Portal
"Netflix полностью работает на Java. Всё, что мы создаем, построено на Java."
Java не идеальна — да и никакой язык не идеален.
Но она существует уже десятилетия и используется в самых разных сферах, от банковских систем до корпоративных приложений, которые действительно поддерживают работу всего мира.
Она не яркая, не «крутая» новинка, но работает. А в мире технологий вещи, которые работают, часто остаются на долгие годы.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Оставайтесь сосредоточенными на кодинге и оптимизируйте свой рабочий процесс в IntelliJIDEA с помощью Run Anything!
Быстро запускайте конфигурации выполнения/отладки, приложения, скрипты, команды и задачи или даже открывайте недавние проекты – из любого места в IDE
Нажмите
⌃⌃
| Ctrl+Ctrl
, чтобы открыть всплывающее окно Run AnythingPlease open Telegram to view this post
VIEW IN TELEGRAM
Основной поток Kafka:
1. Продюсер отправляет сообщение
⏩ Приложение (продюсер) создаёт сообщение с данными.
⏩ Продюсер подключается к брокеру Kafka и выбирает тему.
⏩ Kafka определяет, в какой раздел темы отправить сообщение, распределяя нагрузку.
⏩ Сообщение записывается в лидирующую реплику раздела.
2. Хранение и репликация
⏩ Лидер добавляет сообщение в лог и присваивает ему уникальный офсет.
⏩ Сообщение копируется на резервные реплики для отказоустойчивости.
3. Консьюмер получает сообщения
⏩ Приложение (консьюмер) подключается к группе потребителей.
⏩ Консьюмеры координируют обработку, считывая сообщения из своих разделов.
⏩ Они получают сообщения партиями, начиная с последнего зафиксированного офсета.
4. Подтверждение обработки
⏩ После обработки консьюмер фиксирует новый офсет.
⏩ Kafka отслеживает, какие сообщения успешно потреблены.
5. Цикл продолжается
⏩ Продюсеры продолжают отправлять, консьюмеры — читать и обрабатывать.
⏩ Kafka обеспечивает надёжную и упорядоченную доставку даже при сбоях.
⚠️ Помните:
Поток сообщений в Kafka асинхронный. Продюсеры не ждут, пока консьюмеры обработают сообщения.
Консьюмеры могут отставать от продюсеров, если обработка идёт медленно.
Kafka предлагает механизмы для обработки сбоев и обеспечения семантики доставки at-least-once или exactly-once.
Topics => Partitions => Log Segments
(Данные фактически хранятся в лог-сегментах).
👉 Java Portal
1. Продюсер отправляет сообщение
2. Хранение и репликация
3. Консьюмер получает сообщения
4. Подтверждение обработки
5. Цикл продолжается
Поток сообщений в Kafka асинхронный. Продюсеры не ждут, пока консьюмеры обработают сообщения.
Консьюмеры могут отставать от продюсеров, если обработка идёт медленно.
Kafka предлагает механизмы для обработки сбоев и обеспечения семантики доставки at-least-once или exactly-once.
Topics => Partitions => Log Segments
(Данные фактически хранятся в лог-сегментах).
Please open Telegram to view this post
VIEW IN TELEGRAM
@TransactionalEventListener
— это специализированный @EventListener
, который слушает событие и ожидает завершения текущей транзакции перед его обработкой. Ожидание консистентного состояния базы данных позволяет гораздо безопаснее реагировать на изменения, внесенные в БД.Please open Telegram to view this post
VIEW IN TELEGRAM
Сравнение Comparator и Comparable в Java 👆
Comparable — для встроенной сортировки. Допустим
Comparator — для гибкой сортировки. К примеру, сортировка списка по разным полям
👉 Java Portal
Comparable — для встроенной сортировки. Допустим
string, Integer
Comparator — для гибкой сортировки. К примеру, сортировка списка по разным полям
Please open Telegram to view this post
VIEW IN TELEGRAM
Как в 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