Java Portal | Программирование
11.6K subscribers
858 photos
66 videos
28 files
682 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
Каждый разработчик использует шаблоны проектирования ежедневно, даже не осознавая этого:

> Используешь 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
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
10 однострочников на Java, с которыми ты выглядишь более опытным

🔸Поменять две переменные местами > a = a + b - (b = a);

🔸Создать список > List.of("Apple", "Banana", "Cherry");

🔸Найти максимум из двух чисел > Math.max(a, b);

🔸Прочитать все строки из файла > Files.readAllLines(Path.of("file.txt"));

🔸Объединить список в строку > String.join(", ", fruits);

🔸Удалить null-значения > 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());

👉 Java Portal
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставить @Transactional везде подряд плохая практика — сначала разберись, когда он действительно нужен:

🔸Использовать @Transactional только в сервисном слое — Отделяет бизнес-логику от веб-логики

🔸Использовать транзакции на уровне методов — Даёт точный контроль и ясность

🔸Использовать @Transactional(readOnly = true) — Оптимизирует операции только для чтения

🔸Избегать @Transactional в репозиториях — Репозитории не должны управлять транзакциями

🔸Оставлять транзакционные методы public — Необходимо для работы Spring-прокси

🔸Логировать или отслеживать поведение транзакций — Помогает выявлять неожиданные проблемы

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Java Generics — всё, что нужно знать

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>, если нужна вставка (например, для пакетной обработки или модификации коллекции).

👉 Java Portal
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
Please open Telegram to view this post
VIEW IN TELEGRAM
📚 Эффективное сжатие текста: код Хаффмана в действии 

Приглашаем на открытый урок.

🗓 11 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Алгоритмы и структуры данных».

На этом вебинаре мы продолжим разработку архиватора, реализовав код Хаффмана. 

✔️ Рассмотрим, как построить дерево кодов, где частота появления символов определяет их битовое представление. 
✔️ Интегрируем алгоритм в наш архиватор и проведем сравнительное тестирование с RLE. 
✔️ Увидим, как эффективно работает код Хаффмана на текстовых файлах и других типах данных. 

Отличная возможность изучить продвинутые древовидные структуры данных на практическом примере.

Развивайте алгоритмическое мышление, увеличивайте производительность программ.

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Algo5 

👉 Регистрация на вебинар: https://otus.pw/VyBj/

#реклама
О рекламодателе