Совет по Spring Boot 4. В Jackson 3 теперь в приоритете JsonMapper для работы с JSON. Обрати внимание на новый import. ObjectMapper из com.fasterxml больше не нужен. JsonMapper теперь основной инструмент для JSON в современных Spring-приложениях.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8
Spring Framework 7 добавил встроенный механизм ретраев. Больше не нужно подключать внешнюю зависимость spring-retry. Если надо больше контроля, чем даёт
👉 Java Portal
@Retryable, используй RetryTemplatePlease open Telegram to view this post
VIEW IN TELEGRAM
👍9
Spring Boot 4 делает настройку HTTP-интерфейсов гораздо чище
Больше никакого ручного создания прокси и шаблонного кода. Просто используй
Было 5+ строк конфигурации на каждый клиент → стала одна аннотация
👉 Java Portal
Больше никакого ручного создания прокси и шаблонного кода. Просто используй
@ImportHttpServices и готово.Было 5+ строк конфигурации на каждый клиент → стала одна аннотация
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🤯1
kill -15 даёт ядру возможность завершить процесс аккуратно, чтобы тот успел всё почистить и закрыть как положено.
kill -9 — это уже жёсткий килл, без шансов на «прощальную речь». Процесс просто вырубается, не успев освободить ресурсы или записать данные.
Вот пример с node http-server: при обычном завершении (-15) он корректно закрывает соединения, а при -9 просто падает без возможности что-то доработать.
Короче, будь готов к -9, но надейся на -15.
👉 Java PortalМ
kill -9 — это уже жёсткий килл, без шансов на «прощальную речь». Процесс просто вырубается, не успев освободить ресурсы или записать данные.
Вот пример с node http-server: при обычном завершении (-15) он корректно закрывает соединения, а при -9 просто падает без возможности что-то доработать.
Короче, будь готов к -9, но надейся на -15.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
Дерево зависимостей Spring Boot 4, где в деле видно Jackson 3
Обрати внимание на новые пакеты tools.jackson.* (ядро Jackson 3), идущие вместе с com.fasterxml.jackson.annotations:2.20. Это не ошибка — Jackson 3 специально использует те же аннотации, что и в версии 2, ради совместимости
👉 Java Portal
Обрати внимание на новые пакеты tools.jackson.* (ядро Jackson 3), идущие вместе с com.fasterxml.jackson.annotations:2.20. Это не ошибка — Jackson 3 специально использует те же аннотации, что и в версии 2, ради совместимости
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8
Совет по Java: в циклах лучше использовать StringBuilder, а не String для конкатенации строк.
String - неизменяемый объект, из-за чего при каждой конкатенации создаётся новая строка. Это сильно бьёт по производительности, особенно в больших циклах.
StringBuilder - изменяемый, заточен под многократное добавление строк и работает куда быстрее.
👉 Java Portal
String - неизменяемый объект, из-за чего при каждой конкатенации создаётся новая строка. Это сильно бьёт по производительности, особенно в больших циклах.
StringBuilder - изменяемый, заточен под многократное добавление строк и работает куда быстрее.
// Неэффективный способ:
String result = "";
for (int i = 0; i < 1000; i++) {
result += i; // при каждой итерации создаётся новый объект String
}
// Более эффективный способ:
StringBuilder result = new StringBuilder();
for (int i = 0; i < 1000; i++) {
result.append(i); // добавление в тот же буфер, без лишних аллокаций
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤2
Spring Boot 4 + Jackson 3 сделали клиентскую фильтрацию через
Раньше приходилось оборачивать объекты в😫
Теперь всё проще — просто используй
👉 Java Portal
@JsonView гораздо аккуратнее и удобнееРаньше приходилось оборачивать объекты в
MappingJacksonValue Теперь всё проще — просто используй
.hint()Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2
Камень/ножницы/бумага, реализовано на Java25 в
👉 Java Portal
https://Game.javavoid main() {
IO.println("rock/paper/scissors:");
var u = IO.readln(); // читаем ввод пользователя
if (u.equals("exit")) return; // выходим, если введено "exit"
var c = "rock,paper,scissors".split(","); // список вариантов
var i = List.of(c).indexOf(u); // индекс выбранного пользователем варианта
if (i < 0) return; // если введено что-то не из списка — выходим
var j = new Random().nextInt(3); // случайный выбор компьютера
IO.println("Computer: " + c[j]);
IO.println(i == j ? "Tie!" : (i == (j + 1) % 3 ? "You win!" : "Computer wins!"));
}Please open Telegram to view this post
VIEW IN TELEGRAM
👀7❤6🔥3
Spring Boot: можно использовать
✅ Один из возможных поводов сделать это когда у тебя есть своя конфигурация, которая конфликтует со стандартной.
👉 Java Portal
@SpringBootApplication(exclude = …), чтобы отключить определённые классы автоконфигурации.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🤔1
Если нужно внедрить сгруппированные конфигурационные параметры в классы, можно использовать аннотацию
👉 Java Portal
@ConfigurationProperties вместо @Value@Value обычно применяют для внедрения отдельных свойств:@Value("${app.name}")
private String appName;@ConfigurationProperties лучше подходит для более сложных, сгруппированных настроек:email:
host: smtp.example.com
port: 587
username: [email protected]
password: secret
@Component
@ConfigurationProperties(prefix = "email")
public class EmailProperties {
private String host;
private int port;
private String username;
private String password;
// геттеры и сеттеры
}
@Service
public class EmailService {
private final EmailProperties emailProperties;
public EmailService(EmailProperties emailProperties) {
this.emailProperties = emailProperties;
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
Разбор логов при запуске Spring Boot
Когда запускаешь Spring Boot и в консоли пролетают тонны логов - вот что это всё значит:
1. Spring Boot Banner
Сначала появляется ASCII-баннер с версией Spring Boot:
:: Spring Boot :: (v3.3.4)
Он показывает версию приложения и данные JVM.
2. Стартовая информация
Пример строки:
Starting DemoApplication using Java 21 on LAPTOP with PID 4523
Отображает главный класс, версию Java и PID процесса.
3. Активные профили
Если видишь:
The following profiles are active: dev
Значит, загружается
4. Инициализация ApplicationContext
Spring создаёт
Пример лога:
Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
5. Фаза автоконфигурации
Spring Boot подхватывает
Пример:
Tomcat initialized with port(s): 8080 (http)
Хочешь увидеть детали — запускай с флагом
6. Создание и инициализация бинов
Типичный лог:
Initializing Spring DispatcherServlet 'dispatcherServlet'
Это значит, что веб-слой готов принимать запросы.
7. Запуск веб-сервера
В зависимости от стека:
- Tomcat — для Spring MVC
- Netty — для WebFlux
Пример:
Tomcat started on port(s): 8080 (http) with context path ''
8. Метрики старта
Spring Boot 3.x добавил
9. Приложение готово
Финальный лог:
Started DemoApplication in 2.345 seconds (JVM running for 2.789)
Контекст полностью загружен, приложение работает.
Как посмотреть всё в реальном времени
Запусти приложение с флагом
java -jar app.jar --debug
Ты получишь детализированный отчёт об автоконфигурации и последовательности запуска — удобно для отладки и понимания, что реально происходит при старте.
👉 Java Portal
Когда запускаешь Spring Boot и в консоли пролетают тонны логов - вот что это всё значит:
1. Spring Boot Banner
Сначала появляется ASCII-баннер с версией Spring Boot:
:: Spring Boot :: (v3.3.4)
Он показывает версию приложения и данные JVM.
2. Стартовая информация
Пример строки:
Starting DemoApplication using Java 21 on LAPTOP with PID 4523
Отображает главный класс, версию Java и PID процесса.
3. Активные профили
Если видишь:
The following profiles are active: dev
Значит, загружается
application-dev.yml — удобно для конфигов под разные окружения.4. Инициализация ApplicationContext
Spring создаёт
ApplicationContext, сканирует компоненты, конфигурации и автоконфигурации.Пример лога:
Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
5. Фаза автоконфигурации
Spring Boot подхватывает
AutoConfiguration-классы и автоматически связывает бины.Пример:
Tomcat initialized with port(s): 8080 (http)
Хочешь увидеть детали — запускай с флагом
--debug или --trace.6. Создание и инициализация бинов
Типичный лог:
Initializing Spring DispatcherServlet 'dispatcherServlet'
Это значит, что веб-слой готов принимать запросы.
7. Запуск веб-сервера
В зависимости от стека:
- Tomcat — для Spring MVC
- Netty — для WebFlux
Пример:
Tomcat started on port(s): 8080 (http) with context path ''
8. Метрики старта
Spring Boot 3.x добавил
StartupStep-метрики, чтобы отслеживать, на что уходит время при старте (видно, если включён Actuator).9. Приложение готово
Финальный лог:
Started DemoApplication in 2.345 seconds (JVM running for 2.789)
Контекст полностью загружен, приложение работает.
Как посмотреть всё в реальном времени
Запусти приложение с флагом
--debug:java -jar app.jar --debug
Ты получишь детализированный отчёт об автоконфигурации и последовательности запуска — удобно для отладки и понимания, что реально происходит при старте.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤5
Проект, который я советую каждому разработчику сделать хотя бы раз, написать свой парсер JSON, который превращает строку в нативный объект языка, например словарь.
Формат JSON настолько привычен, что мы просто пользуемся готовыми парсерами и редко задумываемся, как они устроены внутри. Вот основные шаги, если хочешь собрать такой парсер с нуля:
Разобраться со спецификацией JSON.
Написать токенайзер, который выделяет токены из строки (можно использовать Lex).
Определить грамматику JSON по спецификации с помощью Yacc.
Реализовать обработку ошибок, красивый вывод и указание позиции ошибки в строке.
Собрать нативный объект языка — словарь, hashmap и т.д.
Прогнать реализацию на тестах, чтобы убедиться в корректности.
Если хочешь усложнить задачу — не используй Lex и Yacc, а напиши токенайзер и парсер полностью вручную, специально под JSON, без универсальности.
Сделав такой проект, ты не только поймёшь, как работает JSON, но и:
почему его парсинг считается относительно медленным и затратным
как устроена стадия парсинга в любом компиляторе
насколько всё это интересно, если копнуть глубже
Этот проект реально прокачает твои навыки решения задач. Если решишься, то желаю удачи!
👉 Java Portal
Формат JSON настолько привычен, что мы просто пользуемся готовыми парсерами и редко задумываемся, как они устроены внутри. Вот основные шаги, если хочешь собрать такой парсер с нуля:
Разобраться со спецификацией JSON.
Написать токенайзер, который выделяет токены из строки (можно использовать Lex).
Определить грамматику JSON по спецификации с помощью Yacc.
Реализовать обработку ошибок, красивый вывод и указание позиции ошибки в строке.
Собрать нативный объект языка — словарь, hashmap и т.д.
Прогнать реализацию на тестах, чтобы убедиться в корректности.
Если хочешь усложнить задачу — не используй Lex и Yacc, а напиши токенайзер и парсер полностью вручную, специально под JSON, без универсальности.
Сделав такой проект, ты не только поймёшь, как работает JSON, но и:
почему его парсинг считается относительно медленным и затратным
как устроена стадия парсинга в любом компиляторе
насколько всё это интересно, если копнуть глубже
Этот проект реально прокачает твои навыки решения задач. Если решишься, то желаю удачи!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6😁5