Maven — это мощный инструментавтоматизации сборки, который используется в основномдля Java-проектов. Он помогает управлять зависимостями, сборкой и жизненным циклом проекта
$ mvn archetype:generate Создание нового Maven-проекта
$ mvn clean Очистка директории target
$ mvn compile Компиляция исходного кода
$ mvn test Запуск unit-тестов
$ mvn package Сборка проекта в JAR/WAR
$ mvn install Установка артефакта в локальный Maven-репозиторий
$ mvn install -DskipTests Пропустить тесты при сборке
$ mvn spring-boot:run Запуск Spring Boot приложения (если используется spring-boot-maven-plugin)
$ mvn dependency:resolve Обновление зависимостей
$ mvn dependency:tree Вывод дерева зависимостей
$ mvn clean compile package Запуск целей в указанной фазе
⇨ JSON Web Token — это открытыйстандарт (RFC 7519) для безопасной передачи данных между сторонами в виде JSON-объекта. ⇨ Это компактный и самодостаточный способ представить набор утверждений (claims) между двумя сторонами.
Структура JWT
JWT состоитиз трёх частей, разделённых точками (.):
1. Header
⇨ Указывает алгоритм подписи (например, HS256 или RS256) и тип токена (JWT).
2. Payload (Claims)
⇨ Содержит утверждения о сущности (чаще всего — пользователе) и дополнительную информацию.
Типы claims:
➀ Registered claims — стандартизированные: iss, exp, sub, aud и т.д. ➁ Public claims — настраиваются вашим приложением. ➂ Private claims — используются по соглашению между сторонами.
3. Signature
⇨ Создаётся путём подписи закодированных header и payload с использованием секрета или приватного ключа. ⇨ Гарантирует подлинность и целостность токена. Безопасность
При работе с JWT и другими механизмами аутентификации очень важен качественный ревью код.
Инструменты вроде coderabbitai помогают находить уязвимости уже на этапе pull request'ов — с контекстным и построчным анализом.
Такие помощники формируют привычку писать безопасный и чистый код с самого начала 💖
Нашёл годную статью — подробный гайд по ООП в Java: принципы, концепты и реальные примеры. Если ты новичок или хочешь освежить базу — заходи смело. Всё объяснено доступно и с кодом. Приятного чтения 💪
> R — тип элементов в результирующем потоке. > T — тип элементов во входном потоке. > mapper — функция, которая преобразует элемент типа T во входном потоке в поток элементов типа R.
Аннотация @Data объединяет в себе несколько часто используемых аннотаций Lombok:
> @ToString — генерирует метод toString() > @Getter — создаёт геттеры для всех нестатических полей > @Setter — создаёт сеттеры для всех нестатических полей > @EqualsAndHashCode — генерирует equals() и hashCode() > @RequiredArgsConstructor — создаёт конструктор для всех final и @NonNull полей
В новой версии JDK 25улучшили производительность класса String: теперь метод String::hashCode в большинстве случаев сворачивается на этапе компиляции (constant folding).
Это значит: – Меньше затрат в рантайме – Быстрее работа с ключами в HashMap – Эффективнее часто используемые строки
Используйте @FunctionalInterface какзащиту на уровне компиляции
Она помогает не допустить случайного добавления второго абстрактного метода в интерфейс, который должен быть функциональным. Если вы попытаетесь добавить ещё один абстрактный метод в такой интерфейс, компилятор выдаст ошибку ☕️
В этом гайде автор показывает, как парсить структурированные строки в Java
Большинство разработчиков используют регулярные выражения, split() или ручную нарезку строк. Но эти техники подвержены ошибкам, плохо читаются и, что важнее всего — небезопасны на этапе компиляции. Класс StringFormat делает парсинг настолько простым, что даже новичок может реализовать его в одну строку. 😃
Совет по Java: предпочитай внедрение через конструктор, а не через поля
На то есть разные причины:
> Зависимости можно пометить как final, гарантируя, что они не изменятся после создания.
> Повышает надёжность классаи безопасность при работе с потоками
> Заставляет вызывающий код (или DI-контейнер) передать все необходимые зависимости
> Упрощает модульное тестирование, позволяя подставлять моки или стабы через конструктор
> Все зависимости видны в конструкторе, что чётко показывает, что нужно классу для работы.
> Внедрение через конструктор не использует рефлексию или доступ к приватным полям (в отличие от внедрения через поля), что повышает производительность и снижает риски
Эти аннотации используются для управления кэшированием.
Сначала включим это, используя @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() { // Полностью очистит кэш } }
В этом гайде автор делится, как писать удобные интеграционные тесты в Spring Boot
Многие разработчики либо перегружают @SpringBootTest, либо пишут сложные конструкции с @MockBean. Но такие подходы тормозят сборку, плохо читаются и, что важнее всего — дают ложное чувство покрытия.
Класс MockMvc и аннотация @WebMvcTest делают тестирование контроллеров лёгким и быстрым, можно проверить весь HTTP-флоу без запуска сервера.
Ищешь быстрый и удобный GUI для Git? Попробуй Gitnuro — кроссплатформенный клиент, написанный на Kotlin + Rust.
> Просмотр истории коммитов и изменений > Стадирование, откат изменений (даже по отдельным строкам) > Работа с ветками, тегами, и удалёнными репозиториями > Поддержка операций pull, push,merge, rebase, stash > Интерактивный rebase и просмотр blame > Сравнение изображений и поддержка подмодулей > Настраиваемые темы (JSON) > Расширенный поиск по коммитам, авторам и ID 😊