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
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
10 однострочников на Java, с которыми ты выглядишь более опытным
🔸 Поменять две переменные местами >
🔸 Создать список >
🔸 Найти максимум из двух чисел >
🔸 Прочитать все строки из файла >
🔸 Объединить список в строку >
🔸 Удалить null-значения >
🔸 Получить случайный элемент >
🔸 Посчитать совпадения >
🔸 Отсортировать по убыванию >
🔸 Проверить палиндром
👉 Java Portal
a = a + b - (b = a);
List.of("Apple", "Banana", "Cherry");
Math.max(a, b);
Files.readAllLines(Path.of("file.txt"));
String.join(", ", fruits);
list.removeIf(Objects::isNull);
list.get(new Random().nextInt(list.size()));
list.stream().filter(x -> x > 10).count();
list.sort(Comparator.reverseOrder());
str.equals(new StringBuilder(str).reverse().toString());
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Нашёл годную визуализацию для тех, кто хочет на пальцах понять, как устроены LLM. Тут можно не просто почитать про слои моделей, а буквально пощупать их, покрутить со всех сторон в 3D
Есть GPT-2, nanoGPT, GPT-2 XL и GPT-3
Лучше запускать с компа, на мобиле не так красиво
👉 Java Portal
Есть GPT-2, nanoGPT, GPT-2 XL и GPT-3
Лучше запускать с компа, на мобиле не так красиво
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставить
🔸 Использовать
🔸 Использовать транзакции на уровне методов — Даёт точный контроль и ясность
🔸 Использовать
🔸 Избегать
🔸 Оставлять транзакционные методы
🔸 Логировать или отслеживать поведение транзакций — Помогает выявлять неожиданные проблемы
👉 Java Portal
@Transactional
везде подряд плохая практика — сначала разберись, когда он действительно нужен:@Transactional
только в сервисном слое — Отделяет бизнес-логику от веб-логики@Transactional(readOnly = true)
— Оптимизирует операции только для чтения@Transactional
в репозиториях — Репозитории не должны управлять транзакциямиpublic
— Необходимо для работы Spring-проксиPlease open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Это просто огонь. В одном из следующих релизов jetbrains / intellijidea появится фича, которая позволяет в пару кликов сгенерировать JPA-энтити из существующей схемы БД
И ещё, мне сказали, что SpringData JDBC тоже скоро завезут💪
👉 Java Portal
И ещё, мне сказали, что SpringData JDBC тоже скоро завезут
Please open Telegram to view this post
VIEW IN TELEGRAM
Java Generics — всё, что нужно знать
1.
• Используй, когда класс работает с любым типом (например, обёртка вокруг любого объекта, как Box<User>, Box<Integer>).
2.
• Используй, когда метод должен принимать любой тип (например, для печати любого объекта, логирования, сравнения и т.п.).
3.
• Называется верхней границей.
• Используй, когда тип должен быть подклассом чего-то (например, утилита для работы с int, double, float).
4.
• Заставляет T реализовывать и A, и B.
• Используй, когда нужны обе особенности (например, сортировка объекта, который также требует валидации).
5.
• Это означает неизвестный тип.
• Используй, когда не важен тип, нужно только читать (например, печать элементов из любого списка).
6.
• Означает некоторый подкласс T.
• Используй при чтении из коллекции (например, чтение чисел из List<? extends Number> без модификации).
7.
• Означает некоторый суперкласс T.
• Используй при записи в коллекцию (например, добавление
8. Правило PECS
• Producer Extends, Consumer Super.
• Используй
9.
• Это сырой тип.
• Избегай — тк теряется типовая безопасность (например, компилятор не поймает, если добавишь неверные типы).
10. Стирание типов
• Java удаляет всю информацию об обобщениях во время выполнения.
• Поэтому нельзя использовать
11. Обобщённый конструктор
• Используй, когда конструктору нужен обобщённый параметр, даже если сам класс не обобщённый (например, инициализация с динамическими типами).
12. Обобщённый интерфейс
• Используй при преобразовании одного типа в другой (например, DTO → сущность).
13. Нельзя использовать примитивы
• Нельзя
• Используй обёртки (коллекции могут хранить только объекты, не примитивы).
14. Нельзя создавать массивы с обобщением
•
• Используй
15. Нельзя использовать подстановочные типы для вставки
• Нельзя вставлять в
• Используй
👉 Java Portal
1.
Box<T>
→ Обобщённый класс• Используй, когда класс работает с любым типом (например, обёртка вокруг любого объекта, как Box<User>, Box<Integer>).
2.
<T> void print(T val)
→ Обобщённый метод• Используй, когда метод должен принимать любой тип (например, для печати любого объекта, логирования, сравнения и т.п.).
3.
<T extends Number>
→ Ограниченный тип• Называется верхней границей.
• Используй, когда тип должен быть подклассом чего-то (например, утилита для работы с int, double, float).
4.
<T extends A & B>
→ Несколько ограничений• Заставляет T реализовывать и A, и B.
• Используй, когда нужны обе особенности (например, сортировка объекта, который также требует валидации).
5.
<?>
→ Неограниченный подстановочный тип• Это означает неизвестный тип.
• Используй, когда не важен тип, нужно только читать (например, печать элементов из любого списка).
6.
<? extends T>
→ Верхняя граница подстановочного типа• Означает некоторый подкласс T.
• Используй при чтении из коллекции (например, чтение чисел из List<? extends Number> без модификации).
7.
<? super T>
→ Нижняя граница подстановочного типа• Означает некоторый суперкласс T.
• Используй при записи в коллекцию (например, добавление
Integer в List<? super Integer>
).8. Правило PECS
• Producer Extends, Consumer Super.
• Используй
extends
для чтения, super
для записи (например, API-вход против обработки ответа).9.
List list = new ArrayList();
→ Сырой тип• Это сырой тип.
• Избегай — тк теряется типовая безопасность (например, компилятор не поймает, если добавишь неверные типы).
10. Стирание типов
• Java удаляет всю информацию об обобщениях во время выполнения.
• Поэтому нельзя использовать
T.class, new T()
, или instanceof T
(например, нельзя делать проверки или создавать объекты на основе T).11. Обобщённый конструктор
<T> MyClass(T val) { }
• Используй, когда конструктору нужен обобщённый параметр, даже если сам класс не обобщённый (например, инициализация с динамическими типами).
12. Обобщённый интерфейс
interface Mapper<F, T> { T map(F input); }
• Используй при преобразовании одного типа в другой (например, DTO → сущность).
13. Нельзя использовать примитивы
• Нельзя
List<int>
— только List<Integer>
.• Используй обёртки (коллекции могут хранить только объекты, не примитивы).
14. Нельзя создавать массивы с обобщением
•
new T[]
не работает.• Используй
List<T>
вместо (например, динамические коллекции).15. Нельзя использовать подстановочные типы для вставки
• Нельзя вставлять в
List<? extends Number>
.• Используй
<? super Number>
, если нужна вставка (например, для пакетной обработки или модификации коллекции).Please open Telegram to view this post
VIEW IN TELEGRAM
HTTP-концепции, которые должен знать каждый разработчик
> HTTP-методы — Определяют действие: GET (получить), POST (создать), PUT (заменить), PATCH (обновить), DELETE (удалить).
> Коды статуса — Сообщают, что произошло: 2xx (успех), 4xx (ошибка клиента), 5xx (ошибка сервера).
> Заголовки — Пары ключ-значение, которые передают метаинформацию (например, Content-Type, Authorization, Cache-Control).
> Тело запроса — Фактические данные, отправляемые в POST/PUT/PATCH-запросах (часто в формате JSON или form-data).
> Параметры запроса — Пары ключ-значение в URL после ?, используются для фильтрации, сортировки, поиска.
> Параметры пути — Динамические части URL (например, /user/:id), используются для идентификации ресурсов.
> Идемпотентность — Повтор одного и того же запроса (например, PUT или DELETE) приводит к одному и тому же результату.
> Безопасные методы — Методы, такие как GET и HEAD, которые не должны изменять состояние сервера.
> HTTP/1.1 vs HTTP/2 vs HTTP/3 — Новые версии ускоряют работу за счёт мультиплексирования, бинарных фреймов и протокола QUIC.
> Keep-Alive — Повторное использование TCP-соединений для нескольких запросов для снижения задержек.
> Content-Type — Указывает серверу/клиенту, в каком формате тело запроса (например, application/json).
> Accept — Указывает серверу, какие форматы ответа клиент может обрабатывать.
> Authorization — Несёт учетные данные (токены, basic auth) для аутентификации запросов.
> Кэширование — Использует заголовки вроде Cache-Control, ETag, Last-Modified для снижения нагрузки и задержек.
> ETag — Уникальный хеш для версии ресурса; помогает в условных запросах и кэшировании.
> Редиректы (3xx) — Инструктируют клиент попробовать другой URL (например, 301, 302, 307).
> CORS — Управляет тем, какие источники могут обращаться к вашему API из браузера.
> Preflight-запросы — Запросы типа OPTIONS, которые браузер отправляет перед некоторыми CORS-запросами для проверки разрешений.
> Туннелирование HTTP-методов — Некоторые прокси пропускают только GET/POST, поэтому PUT/DELETE инкапсулируются через POST + _method.
> User-Agent — Заголовок, который браузеры отправляют для идентификации (часто подделывается или изменяется).
> Referer — Заголовок, указывающий URL предыдущей страницы (используется в аналитике и безопасности).
> Host Header — Указывает домен, на который направлен запрос (важен при виртуальном хостинге).
> Connection Header — Управляет поведением соединения (например, close, keep-alive).
> HEAD-метод — Как GET, но возвращает только заголовки (без тела); полезен для проверки ресурсов.
👉 Java Portal
> HTTP-методы — Определяют действие: GET (получить), POST (создать), PUT (заменить), PATCH (обновить), DELETE (удалить).
> Коды статуса — Сообщают, что произошло: 2xx (успех), 4xx (ошибка клиента), 5xx (ошибка сервера).
> Заголовки — Пары ключ-значение, которые передают метаинформацию (например, Content-Type, Authorization, Cache-Control).
> Тело запроса — Фактические данные, отправляемые в POST/PUT/PATCH-запросах (часто в формате JSON или form-data).
> Параметры запроса — Пары ключ-значение в URL после ?, используются для фильтрации, сортировки, поиска.
> Параметры пути — Динамические части URL (например, /user/:id), используются для идентификации ресурсов.
> Идемпотентность — Повтор одного и того же запроса (например, PUT или DELETE) приводит к одному и тому же результату.
> Безопасные методы — Методы, такие как GET и HEAD, которые не должны изменять состояние сервера.
> HTTP/1.1 vs HTTP/2 vs HTTP/3 — Новые версии ускоряют работу за счёт мультиплексирования, бинарных фреймов и протокола QUIC.
> Keep-Alive — Повторное использование TCP-соединений для нескольких запросов для снижения задержек.
> Content-Type — Указывает серверу/клиенту, в каком формате тело запроса (например, application/json).
> Accept — Указывает серверу, какие форматы ответа клиент может обрабатывать.
> Authorization — Несёт учетные данные (токены, basic auth) для аутентификации запросов.
> Кэширование — Использует заголовки вроде Cache-Control, ETag, Last-Modified для снижения нагрузки и задержек.
> ETag — Уникальный хеш для версии ресурса; помогает в условных запросах и кэшировании.
> Редиректы (3xx) — Инструктируют клиент попробовать другой URL (например, 301, 302, 307).
> CORS — Управляет тем, какие источники могут обращаться к вашему API из браузера.
> Preflight-запросы — Запросы типа OPTIONS, которые браузер отправляет перед некоторыми CORS-запросами для проверки разрешений.
> Туннелирование HTTP-методов — Некоторые прокси пропускают только GET/POST, поэтому PUT/DELETE инкапсулируются через POST + _method.
> User-Agent — Заголовок, который браузеры отправляют для идентификации (часто подделывается или изменяется).
> Referer — Заголовок, указывающий URL предыдущей страницы (используется в аналитике и безопасности).
> Host Header — Указывает домен, на который направлен запрос (важен при виртуальном хостинге).
> Connection Header — Управляет поведением соединения (например, close, keep-alive).
> HEAD-метод — Как GET, но возвращает только заголовки (без тела); полезен для проверки ресурсов.
Please open Telegram to view this post
VIEW IN TELEGRAM