Нашёл полезную и простую статью про докеризацию Spring Boot.
Внутри — три подхода к сборке Docker-образов
> Классический Dockerfile
> Buildpacks через Spring Boot Maven Plugin
> Google Jib — без Docker и без Dockerfile, всё через Maven/Gradle
— примеры кода, запуск, деплой, советы и сравнение подходов.
Отлично подойдёт для джунов и тех, кто только начинает знакомство с Docker.
Рекомендую, чтиво полезное😊
👉 Java Portal
Внутри — три подхода к сборке Docker-образов
> Классический Dockerfile
> Buildpacks через Spring Boot Maven Plugin
> Google Jib — без Docker и без Dockerfile, всё через Maven/Gradle
— примеры кода, запуск, деплой, советы и сравнение подходов.
Отлично подойдёт для джунов и тех, кто только начинает знакомство с Docker.
Рекомендую, чтиво полезное
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы использовали сопоставление с образцом (pattern matching) для
До Pattern Matching:
Здесь нужно вручную приводить тип, хотя компилятор уже знает, что
С Pattern Matching (начиная с Java 16+):
👉 Java Portal
instanceof
?До Pattern Matching:
Object obj = "Hello Java!";
if (obj instanceof String) {
String s = (String) obj; // Лишнее приведение типа
System.out.println(s.length());
}
Здесь нужно вручную приводить тип, хотя компилятор уже знает, что
obj
— это String.С Pattern Matching (начиная с Java 16+):
Object obj = "Hello Modern Java!";
if (obj instanceof String s) { // s автоматически приводится к типу String
System.out.println(s.length());
}
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Нашёл годную статью — подробный гайд по ООП в Java: принципы, концепты и реальные примеры. Если ты новичок или хочешь освежить базу — заходи смело. Всё объяснено доступно и с кодом. Приятного чтения 💪
> источник
👉 Java Portal
> источник
Please open Telegram to view this post
VIEW IN TELEGRAM
Интерфейс JpaRepository
Это готовое решение для CRUD-операций. Просто унаследуйся от
👉 Java Portal
Это готовое решение для CRUD-операций. Просто унаследуйся от
JpaRepository<Entity, ID>
— и получи save, find, delete, update
без лишнего кодаPlease open Telegram to view this post
VIEW IN TELEGRAM
Как работает FlatMap в Java?
Mapping
Из исходного потока каждый элемент проходит через функцию, которая возвращает новый поток.
Это отличается от map(), так как здесь функция возвращает потоки, а не отдельные значения.
Flattening
Поскольку на предыдущем шаге мы получили несколько потоков, этот шаг просто объединяет их в один поток.
Синтаксис и параметры для flatMap():
> R — тип элементов в результирующем потоке.
> T — тип элементов во входном потоке.
> mapper — функция, которая преобразует элемент типа T во входном потоке в поток элементов типа R.
👉 Java Portal
Mapping
Из исходного потока каждый элемент проходит через функцию, которая возвращает новый поток.
Это отличается от map(), так как здесь функция возвращает потоки, а не отдельные значения.
Flattening
Поскольку на предыдущем шаге мы получили несколько потоков, этот шаг просто объединяет их в один поток.
Синтаксис и параметры для flatMap():
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
> R — тип элементов в результирующем потоке.
> T — тип элементов во входном потоке.
> mapper — функция, которая преобразует элемент типа T во входном потоке в поток элементов типа R.
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-05-27_07-57-06.png
255 KB
Java Lombok: Аннотация
Аннотация
>
>
>
>
>
👉 Java Portal
@Data
— всё в одномАннотация
@Data
объединяет в себе несколько часто используемых аннотаций Lombok:>
@ToString
— генерирует метод toString()>
@Getter
— создаёт геттеры для всех нестатических полей>
@Setter
— создаёт сеттеры для всех нестатических полей>
@EqualsAndHashCode
— генерирует equals() и hashCode()>
@RequiredArgsConstructor
— создаёт конструктор для всех final и @NonNull
полейPlease open Telegram to view this post
VIEW IN TELEGRAM
JDK 25: String::hashCode стал быстрее
В новой версии JDK 25 улучшили производительность класса String: теперь метод
Это значит:
– Меньше затрат в рантайме
– Быстрее работа с ключами в HashMap
– Эффективнее часто используемые строки
⏩ Подробнее: https://social.ora.cl/6014274Ew
👉 Java Portal
В новой версии JDK 25 улучшили производительность класса String: теперь метод
String::hashCode
в большинстве случаев сворачивается на этапе компиляции (constant folding).Это значит:
– Меньше затрат в рантайме
– Быстрее работа с ключами в HashMap
– Эффективнее часто используемые строки
Please open Telegram to view this post
VIEW IN TELEGRAM
Каждый разработчик использует шаблоны проектирования ежедневно, даже не осознавая этого:
> Используешь DI, когда аннотируешь поле
> Вызываешь
> Передаёшь
>
>
> Оборачиваешь
👉 Java Portal
> Используешь DI, когда аннотируешь поле
@Autowired
или полагаешься на Spring для автосвязывания бинов.> Вызываешь
Executors.newFixedThreadPool()
— это паттерн Factory, возвращающий настроенный объект.> Передаёшь
Comparator
в Collections.sort()
— это паттерн Strategy, позволяющий задать поведение на лету.>
PropertyChangeListener
в Swing
или ApplicationListener
в Spring — это паттерн Observer.>
StringBuilder.append()
— это паттерн Builder, пошагово создающий объект.> Оборачиваешь
BufferedReader
вокруг InputStreamReader
— это паттерн DecoratorPlease open Telegram to view this post
VIEW IN TELEGRAM
Spring Batch упрощает управление ETL-задачами
Просто определи job'ы, step'ы и chunk'и — остальное он сделает сам
Из коробки поддерживает транзакции, повторы и отслеживание статуса заданий
Вот краткое введение в Spring Batch с практическим примером переноса данных из CSV в XML — тык🪑
👉 Java Portal
Просто определи job'ы, step'ы и chunk'и — остальное он сделает сам
Из коробки поддерживает транзакции, повторы и отслеживание статуса заданий
Вот краткое введение в Spring Batch с практическим примером переноса данных из CSV в XML — тык
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Звучит знакомо:
Почему у этого свойства такое значение?
С какой базой данных работает моё приложение?
Какие бины активны?
Встречайте Spring Debugger — плагин для IntelliJ IDEA, который показывает, что на самом деле происходит в вашем приложении с аннотацией🥺
👉 Java Portal
Почему у этого свойства такое значение?
С какой базой данных работает моё приложение?
Какие бины активны?
Встречайте Spring Debugger — плагин для IntelliJ IDEA, который показывает, что на самом деле происходит в вашем приложении с аннотацией
@SpringBoot
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java API
Используйте
Она помогает не допустить случайного добавления второго абстрактного метода в интерфейс, который должен быть функциональным.
Если вы попытаетесь добавить ещё один абстрактный метод в такой интерфейс, компилятор выдаст ошибку☕️
👉 Java Portal
Используйте
@FunctionalInterface
как защиту на уровне компиляцииОна помогает не допустить случайного добавления второго абстрактного метода в интерфейс, который должен быть функциональным.
Если вы попытаетесь добавить ещё один абстрактный метод в такой интерфейс, компилятор выдаст ошибку
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом гайде автор показывает, как парсить структурированные строки в Java
Большинство разработчиков используют регулярные выражения,
Класс😃
👉 Java Portal
Большинство разработчиков используют регулярные выражения,
split()
или ручную нарезку строк. Но эти техники подвержены ошибкам, плохо читаются и, что важнее всего — небезопасны на этапе компиляции.Класс
StringFormat
делает парсинг настолько простым, что даже новичок может реализовать его в одну строку. Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java: предпочитай внедрение через конструктор, а не через поля
На то есть разные причины:
> Зависимости можно пометить как
> Повышает надёжность класса и безопасность при работе с потоками
> Заставляет вызывающий код (или DI-контейнер) передать все необходимые зависимости
> Упрощает модульное тестирование, позволяя подставлять моки или стабы через конструктор
> Все зависимости видны в конструкторе, что чётко показывает, что нужно классу для работы.
> Внедрение через конструктор не использует рефлексию или доступ к приватным полям (в отличие от внедрения через поля), что повышает производительность и снижает риски
👉 Java Portal
На то есть разные причины:
> Зависимости можно пометить как
final
, гарантируя, что они не изменятся после создания.> Повышает надёжность класса и безопасность при работе с потоками
> Заставляет вызывающий код (или DI-контейнер) передать все необходимые зависимости
> Упрощает модульное тестирование, позволяя подставлять моки или стабы через конструктор
> Все зависимости видны в конструкторе, что чётко показывает, что нужно классу для работы.
> Внедрение через конструктор не использует рефлексию или доступ к приватным полям (в отличие от внедрения через поля), что повышает производительность и снижает риски
Please open Telegram to view this post
VIEW IN TELEGRAM
Обрати внимание на JEP 505 — он упрощает конкурентное программирование, вводя API для структурированной конкуренции.
> https://openjdk.org/jeps/505
👉 Java Portal
> https://openjdk.org/jeps/505
Please open Telegram to view this post
VIEW IN TELEGRAM
@CacheEvict
, @CachePut
и @Cacheable
Эти аннотации используются для управления кэшированием.
Сначала включим это, используя
@EnableCaching
, как показано ниже:@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Пример:
@Service
public class ProductService {
private final ProductRepository productRepository;
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
@Cacheable(value = "products", key = "#id", condition = "#id > 0")
public Product getProductById(Long id) {
// Будет выполнен только если результат отсутствует в кэше
return productRepository.findById(id)
.orElseThrow(() -> new ProductNotFoundException(id));
}
@CachePut(value = "products", key = "#product.id")
public Product updateProduct(Product product) {
// Будет выполнен всегда, и результат обновит кэш
return productRepository.save(product);
}
@CacheEvict(value = "products", key = "#id")
public void deleteProduct(Long id) {
// Удалит запись из кэша
productRepository.deleteById(id);
}
@CacheEvict(value = "products", allEntries = true)
public void clearProductCache() {
// Полностью очистит кэш
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом гайде автор делится, как писать удобные интеграционные тесты в Spring Boot
Многие разработчики либо перегружают
Класс
👉 Java Portal
Многие разработчики либо перегружают
@SpringBootTest
, либо пишут сложные конструкции с @MockBean
. Но такие подходы тормозят сборку, плохо читаются и, что важнее всего — дают ложное чувство покрытия.Класс
MockMvc
и аннотация @WebMvcTest
делают тестирование контроллеров лёгким и быстрым, можно проверить весь HTTP-флоу без запуска сервера.Please open Telegram to view this post
VIEW IN TELEGRAM
Ищешь быстрый и удобный GUI для Git? Попробуй Gitnuro — кроссплатформенный клиент, написанный на Kotlin + Rust.
> Просмотр истории коммитов и изменений
> Стадирование, откат изменений (даже по отдельным строкам)
> Работа с ветками, тегами, и удалёнными репозиториями
> Поддержка операций pull, push, merge, rebase, stash
> Интерактивный rebase и просмотр blame
> Сравнение изображений и поддержка подмодулей
> Настраиваемые темы (JSON)
> Расширенный поиск по коммитам, авторам и ID😊
👉 Java Portal
> Просмотр истории коммитов и изменений
> Стадирование, откат изменений (даже по отдельным строкам)
> Работа с ветками, тегами, и удалёнными репозиториями
> Поддержка операций pull, push, merge, rebase, stash
> Интерактивный rebase и просмотр blame
> Сравнение изображений и поддержка подмодулей
> Настраиваемые темы (JSON)
> Расширенный поиск по коммитам, авторам и ID
Please open Telegram to view this post
VIEW IN TELEGRAM
Устали от продакшн-огня, но не хотите уходить из IT? ❤️🔥
В автоматизации тестирования не горит и обычно не падает в пятницу вечером. Зато кодить всё ещё нужно.
Приходите на вебинар «Автотест на Java и карьера QA-автоматизатора» — в четверг, 5 июня.
▶️ ▶️ Занять место ▶️
Занятие проводят инженеры QA.GURU, создатели авторской программы по обучению автоматизации.
Что будет?
— узнаете, чем отличается Manual от Automation QA;
— разберетесь, куда двигается рынок, и почему автоматизаторы нужны всем.
А еще на занятии вы:
— напишете свой автотест на Java: логин, поиск в Google шаг за шагом;
— подключите Web, Mobile и API в одном проекте.
Спикер, Станислав Васенков — QA-инженер, 10+ лет в автоматизации, ex-Head of QAA pflb.ru и автор библиотеки allure-notifications, спикер QA-митапов. Победитель хакатона по автоматизации тестирования от Epam.
На нашей встрече Стас покажет, как специалисту с бэкграундом в разработке стартовать в автоматизации.
🎯 Будет интересно,если вы:
— Java-разработчик, который хочет уйти от багфиксов, но остаться в IT;
— ищете менее выгорающий трек с хорошей техбазой;
— хотите понять, как устроена современная автоматизация и где вы в ней можете быть полезны.
Участие бесплатное, но нужна регистрация.
▶️ Занять место можно до четверга.
Реклама. Рекламодатель: ИП Васенков Станислав Олегович, ИНН 774335827403, erid: 2VtzqvPCxSq
В автоматизации тестирования не горит и обычно не падает в пятницу вечером. Зато кодить всё ещё нужно.
Приходите на вебинар «Автотест на Java и карьера QA-автоматизатора» — в четверг, 5 июня.
Занятие проводят инженеры QA.GURU, создатели авторской программы по обучению автоматизации.
Что будет?
— узнаете, чем отличается Manual от Automation QA;
— разберетесь, куда двигается рынок, и почему автоматизаторы нужны всем.
А еще на занятии вы:
— напишете свой автотест на Java: логин, поиск в Google шаг за шагом;
— подключите Web, Mobile и API в одном проекте.
Спикер, Станислав Васенков — QA-инженер, 10+ лет в автоматизации, ex-Head of QAA pflb.ru и автор библиотеки allure-notifications, спикер QA-митапов. Победитель хакатона по автоматизации тестирования от Epam.
На нашей встрече Стас покажет, как специалисту с бэкграундом в разработке стартовать в автоматизации.
🎯 Будет интересно,если вы:
— Java-разработчик, который хочет уйти от багфиксов, но остаться в IT;
— ищете менее выгорающий трек с хорошей техбазой;
— хотите понять, как устроена современная автоматизация и где вы в ней можете быть полезны.
Участие бесплатное, но нужна регистрация.
Реклама. Рекламодатель: ИП Васенков Станислав Олегович, ИНН 774335827403, erid: 2VtzqvPCxSq
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-06-02_08-13-46.png
1.3 MB
Шпаргалка по аннотациям безопасности Spring Security
👉 Java Portal
@EnableWebSecurity
—> Включает поддержку веб-безопасности Spring Security и интеграцию с Spring MVC. Применяется к конфигурационному классу для активации безопасности.@EnableGlobalMethodSecurity
/ @EnableMethodSecurity
(Spring Security 6+) —> Включает методный уровень безопасности (например, @PreAuthorize, @Secured
). @EnableMethodSecurity
— новая версия для Spring Security 6+.@PreAuthorize("expression")
—> Проверяет выражение SpEL до выполнения метода. Часто используется для ролевого доступа, например: @PreAuthorize("hasRole('ADMIN')")
.@PostAuthorize("expression")
—> Похожа на @PreAuthorize
, но проверка происходит после выполнения метода. Полезно для фильтрации возвращаемых данных.@Secured("ROLE_NAME")
—> Разрешает доступ к методу только при наличии указанной роли. Менее гибкая, чем @PreAuthorize
@RolesAllowed("ROLE_NAME")
—> Аннотация из JSR-250, ограничивает доступ по ролям. Требует включённой опции @EnableMethodSecurity(jsr250Enabled = true)
@AuthenticationPrincipal
—> Внедряет текущего аутентифицированного пользователя (Principal или объект UserDetails
) в контроллер или метод.@WithMockUser
—> Используется в тестах для эмуляции аутентифицированного пользователя с заданными ролями.@PermitAl
l —> Разрешает доступ всем пользователям, включая неаутентифицированных. Требует поддержки JSR-250.@DenyAll
—> Запрещает доступ всем, включая аутентифицированных пользователей. Также входит в JSR-250.Please open Telegram to view this post
VIEW IN TELEGRAM
Структурированное логгирование в Spring Boot 3.5.5
Spring Boot 3.5.5 привносит улучшенную поддержку структурированного логгирования.
Чтобы включить его, добавьте в
Теперь логи будут более чистыми и структурированными, что упрощает их парсинг в инструментах вроде ELK, Grafana или Datadog.
👉 Java Portal
Spring Boot 3.5.5 привносит улучшенную поддержку структурированного логгирования.
Чтобы включить его, добавьте в
application.yml
следующее: logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %X - %msg%n"
Теперь логи будут более чистыми и структурированными, что упрощает их парсинг в инструментах вроде ELK, Grafana или Datadog.
Please open Telegram to view this post
VIEW IN TELEGRAM