Java Portal | Программирование
11.5K subscribers
852 photos
64 videos
24 files
671 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
Нашёл полезную и простую статью про докеризацию Spring Boot.

Внутри — три подхода к сборке Docker-образов

> Классический Dockerfile
> Buildpacks через Spring Boot Maven Plugin
> Google Jib — без Docker и без Dockerfile, всё через Maven/Gradle

— примеры кода, запуск, деплой, советы и сравнение подходов.

Отлично подойдёт для джунов и тех, кто только начинает знакомство с Docker.

Рекомендую, чтиво полезное 😊

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы использовали сопоставление с образцом (pattern matching) для 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());
}


👉 Java Portal
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-операций. Просто унаследуйся от JpaRepository<Entity, ID> — и получи save, find, delete, update без лишнего кода

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Как работает FlatMap в Java?

Mapping


Из исходного потока каждый элемент проходит через функцию, которая возвращает новый поток.

Это отличается от map(), так как здесь функция возвращает потоки, а не отдельные значения.

Flattening

Поскольку на предыдущем шаге мы получили несколько потоков, этот шаг просто объединяет их в один поток.

Синтаксис и параметры
для flatMap():

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)


> R — тип элементов в результирующем потоке.
> T — тип элементов во входном потоке.
> mapper — функция, которая преобразует элемент типа T во входном потоке в поток элементов типа R.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-05-27_07-57-06.png
255 KB
Java Lombok: Аннотация @Data — всё в одном

Аннотация @Data объединяет в себе несколько часто используемых аннотаций Lombok:

> @ToString — генерирует метод toString()
> @Getter — создаёт геттеры для всех нестатических полей
> @Setter — создаёт сеттеры для всех нестатических полей
> @EqualsAndHashCode — генерирует equals() и hashCode()
> @RequiredArgsConstructor — создаёт конструктор для всех final и @NonNull полей

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
JDK 25: String::hashCode стал быстрее

В новой версии JDK 25 улучшили производительность класса String: теперь метод String::hashCode в большинстве случаев сворачивается на этапе компиляции (constant folding).

Это значит:
– Меньше затрат в рантайме
– Быстрее работа с ключами в HashMap
– Эффективнее часто используемые строки

Подробнее: https://social.ora.cl/6014274Ew

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Каждый разработчик использует шаблоны проектирования ежедневно, даже не осознавая этого:

> Используешь DI, когда аннотируешь поле @Autowired или полагаешься на Spring для автосвязывания бинов.

> Вызываешь Executors.newFixedThreadPool() — это паттерн Factory, возвращающий настроенный объект.

> Передаёшь Comparator в Collections.sort() — это паттерн Strategy, позволяющий задать поведение на лету.

> PropertyChangeListener в Swing или ApplicationListener в Spring — это паттерн Observer.

> StringBuilder.append() — это паттерн Builder, пошагово создающий объект.

> Оборачиваешь BufferedReader вокруг InputStreamReader — это паттерн Decorator

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Batch упрощает управление ETL-задачами

Просто определи job'ы, step'ы и chunk'и — остальное он сделает сам

Из коробки поддерживает транзакции, повторы и отслеживание статуса заданий

Вот краткое введение в Spring Batch с практическим примером переноса данных из CSV в XML — тык 🪑

👉 Java Portal
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, который показывает, что на самом деле происходит в вашем приложении с аннотацией @SpringBoot 🥺

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java API

Используйте @FunctionalInterface как защиту на уровне компиляции

Она помогает не допустить случайного добавления второго абстрактного метода в интерфейс, который должен быть функциональным.
Если вы попытаетесь добавить ещё один абстрактный метод в такой интерфейс, компилятор выдаст ошибку ☕️

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом гайде автор показывает, как парсить структурированные строки в Java

Большинство разработчиков используют регулярные выражения, split() или ручную нарезку строк. Но эти техники подвержены ошибкам, плохо читаются и, что важнее всего — небезопасны на этапе компиляции.
Класс StringFormat делает парсинг настолько простым, что даже новичок может реализовать его в одну строку. 😃

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java: предпочитай внедрение через конструктор, а не через поля

На то есть разные причины:

> Зависимости можно пометить как final, гарантируя, что они не изменятся после создания.

> Повышает надёжность класса и безопасность при работе с потоками

> Заставляет вызывающий код (или DI-контейнер) передать все необходимые зависимости

> Упрощает модульное тестирование, позволяя подставлять моки или стабы через конструктор

> Все зависимости видны в конструкторе, что чётко показывает, что нужно классу для работы.

> Внедрение через конструктор не использует рефлексию или доступ к приватным полям (в отличие от внедрения через поля), что повышает производительность и снижает риски

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Обрати внимание на JEP 505 — он упрощает конкурентное программирование, вводя API для структурированной конкуренции.

> https://openjdk.org/jeps/505

👉 Java Portal
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() {
// Полностью очистит кэш
}
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом гайде автор делится, как писать удобные интеграционные тесты в Spring Boot

Многие разработчики либо перегружают @SpringBootTest, либо пишут сложные конструкции с @MockBean. Но такие подходы тормозят сборку, плохо читаются и, что важнее всего — дают ложное чувство покрытия.

Класс MockMvc и аннотация @WebMvcTest делают тестирование контроллеров лёгким и быстрым, можно проверить весь HTTP-флоу без запуска сервера.

👉 Java Portal
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
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
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-06-02_08-13-46.png
1.3 MB
Шпаргалка по аннотациям безопасности Spring Security

@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 —> Используется в тестах для эмуляции аутентифицированного пользователя с заданными ролями.

@PermitAll —> Разрешает доступ всем пользователям, включая неаутентифицированных. Требует поддержки JSR-250.

@DenyAll —> Запрещает доступ всем, включая аутентифицированных пользователей. Также входит в JSR-250.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Структурированное логгирование в Spring Boot 3.5.5

Spring Boot 3.5.5 привносит улучшенную поддержку структурированного логгирования.

Чтобы включить его, добавьте в application.yml следующее:

logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %X - %msg%n"


Теперь логи будут более чистыми и структурированными, что упрощает их парсинг в инструментах вроде ELK, Grafana или Datadog.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM