Одно из крупнейших событий для Java и Spring разработчиков собрало ведущих экспертов, чтобы поделиться новыми практиками и инструментами.
Расписание докладов на 27 августа:
* Let's Explore Spring Security 6.4 – Rob Winch
* Building and Monetizing Generative AI Plugins with Spring AI – Denis Magda
* Build GraphQL Services with Spring Boot like Netflix – Paul Bakker
* Efficient Containers with Spring Boot 3, Java 21 and CDS – Sébastien Deleuze
Расписание докладов на 28 августа:
* Let's Generate Art with Kubernetes and Spring! – Tiffany Jernigan
* Scaling APIs with Spring Cloud – Luke Shannon, Spencer Gibb
* Bootiful Artificial Intelligence – Josh Long, Mark Pollack, Rod Johnson
* Learnings from Netflix to Effective Testing with Spring Boot – Paul Bakker
* Spring Modulith and I: An Apprenticeship in Team Building – Tim Sparg
* Micrometer Mastery: Unleash Advanced Observability in Your JVM Apps – Jonatan Ivanov
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤7🔥5
Как показывает опыт Netflix, использование виртуальных потоков, представленных в Java 21, может спровоцировать возникновение неожиданных проблем. В новом переводе от команды Spring АйО мы подробно исследуем уникальные трудности, возникшие у команды Netflix при интеграции виртуальных потоков с SpringBoot и Tomcat.
Давайте же посмотрим, как виртуальные потоки могут повлиять на производительность и стабильность системы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤8🔥8
Команда Spring АйО продолжает следить за последними новинками в мире инструментов для разработчиков.
В нашем новом переводе вы узнаете о недавно появившемся плагине для IntelliJ IDEA, который предоставляет долгожданную многими функциональность!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥5❤2👎1
#SpringHero ⭐️ Juergen Hoeller
Предыдущий пост из серии Spring Hero был про основателя Spring Framework, а сегодня расскажем про сооснователя – Juergen Hoeller. С 2003 года он выполняет обязанности руководителя проекта и менеджера по релизам core фреймворка.
На данный момент Juergen Hoeller является контрибьютором в Spring Framework, который сделал больше всех коммитов – 7,809! На наш взгляд, только лишь этого факта уже достаточно, чтобы считать его настоящим Spring Hero!
Но Juergen не ограничивает себя только разработкой. Его довольно часто можно заметить на различных IT-конференциях: от нашего любимого JPoint и до всемирно известных Devoxx и Spring IO.
😌 @spring_aio
Предыдущий пост из серии Spring Hero был про основателя Spring Framework, а сегодня расскажем про сооснователя – Juergen Hoeller. С 2003 года он выполняет обязанности руководителя проекта и менеджера по релизам core фреймворка.
На данный момент Juergen Hoeller является контрибьютором в Spring Framework, который сделал больше всех коммитов – 7,809! На наш взгляд, только лишь этого факта уже достаточно, чтобы считать его настоящим Spring Hero!
Но Juergen не ограничивает себя только разработкой. Его довольно часто можно заметить на различных IT-конференциях: от нашего любимого JPoint и до всемирно известных Devoxx и Spring IO.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍11❤3
Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!
– Какой у вас уровень, как у разработчика? – провели опрос среди подписчиков. Участвуй, если ещё не успел!
– SpringOne 2024 – поделились расписанием 2-го и 3-го дня самой масштабной конференции про Spring.
– Виртуальные потоки Java 21 — чувак, где мой lock? – узнали, с какими проблемами можно столкнуться, если уже сейчас начать использовать виртуальные потоки в SpringBoot.
– Workspaces в IntelliJ IDEA – рассказали про одну из самых ожидаемых фич для IntelliJ IDEA.
– #SpringHero: Juergen Hoeller – рассказали про сооснователя и самого активного контрибьютора в Spring Framework.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4❤1
Команда Spring АйО подготовила перевод статьи, посвящённой истории Java — одного из самых популярных языков программирования.
В статье вы найдёте не только краткую историю языка, но и его ключевые характеристики, которые сделали этот язык программирования таким востребованным.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤6🔥5
Эксперты сообщества Spring АйО уже в студии, на онлайн-митапе от команды Amplicode!
В мероприятии примут участие:
* Илья Сазонов
* Федор Сазонов
* Павел Кислов
* Рустам Курамшин
* Кирилл Толкачёв
* и другие!
Проверка оборудования уже завершена, а до начала прямого эфира осталось 5 минут – присоединяйтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥9❤6👎2
🐫 Underscore в имени Spring Data JPA методов
Все мы знаем, что для именования методов в java принято использовать lowerCamelCase. Но при определенных обстоятельствах правила можно и даже нужно нарушать! Например, когда в игру вступают фреймворки. Один такой пример мы сегодня с вами рассмотрим.
Предположим, у нас есть модель питомец-владелец питомца (многие-к-одному). Чтобы повысить перформанс нашего приложения, нам пришлось немного декомпозировать модель, добавив атрибут в класс питомца, в котором будет храниться информация о владельце – ownerLastName.
Класс питомца:
И класс владельца питомца:
Используя Spring Data JPA и
Здесь нам пришлось правила именования и определить метод с "_" перед атрибутом. В этом случае Hibernate сгенерирует следующий запрос:
А если же мы хотим получить значения из таблицы
Тогда поиск будет осуществлен по колонке из таблицы
Подробнее про именование Spring Data JPA методов можно прочитать в документации.
P.S. А знаете ли вы ещё примеры подобного слома шаблонов?
#SpringTips #JPA
Все мы знаем, что для именования методов в java принято использовать lowerCamelCase. Но при определенных обстоятельствах правила можно и даже нужно нарушать! Например, когда в игру вступают фреймворки. Один такой пример мы сегодня с вами рассмотрим.
Предположим, у нас есть модель питомец-владелец питомца (многие-к-одному). Чтобы повысить перформанс нашего приложения, нам пришлось немного декомпозировать модель, добавив атрибут в класс питомца, в котором будет храниться информация о владельце – ownerLastName.
Класс питомца:
@Getter
@Setter
@Entity
@Table(name = "pet")
public class Pet {
@Id
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "owner_id")
private Owner owner;
@Column(name = "owner_last_name")
private String ownerLastName;
}
И класс владельца питомца:
@Getter
@Setter
@Entity
@Table(name = "owner")
public class Owner {
@Id
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@OneToMany(mappedBy = "owner", orphanRemoval = true)
private Set<Pet> pets = new LinkedHashSet<>();
}
Используя Spring Data JPA и
derived
методы нужно учитывать следующий нюанс. Получение списка питомцев по имени их владельца с выборкой именно по столбцу из таблицы с владельцами, а не по полю ownerLastName
будет выглядеть следующим образом:
public interface PetRepository extends JpaRepository<Pet, Integer> {
List<Pet> findByOwner_LastName(String lastName);
}
Здесь нам пришлось правила именования и определить метод с "_" перед атрибутом. В этом случае Hibernate сгенерирует следующий запрос:
select *
from pet
left join owner on id=pet.owner_id
where owner.last_name=?
А если же мы хотим получить значения из таблицы
pet
, а не из owner
, то нужно объявить метод без нижнего подчеркивания:
public interface PetRepository extends JpaRepository<Pet, Integer> {
List<Pet> findByOwnerLastName(String lastName);
}
Тогда поиск будет осуществлен по колонке из таблицы
pet
:
select *
from pet
where pet.owner_last_name=?
Подробнее про именование Spring Data JPA методов можно прочитать в документации.
P.S. А знаете ли вы ещё примеры подобного слома шаблонов?
#SpringTips #JPA
🔥37👍16❤4🤔3
Рады представить – Павел Кислов, эксперт сообщества Spring АйО, известный по своим выступлениям на JPoint про Spring Security и работу с гео-данными. Сегодня Павел решил поделиться с нами материалами, которые он считает отличными для полноценного погружения в Spring Security!
Когда речь заходит про безопасность и Spring Security, то чаще всего перед нами возникает больше вопросов, чем ответов. Информации очень много, тема сложна и многогранна, но, уверен, что для решения большинства возникающих типовых архитектурных задач, связанных с уязвимостями при разработке систем с использованием Spring Framework, материалов, представленных ниже, хватит и будет достаточно для понимания основных концепций и подходов.
1. Плейлист по актуальному Spring Security от Laur Spilca (english)
2. Плейлист по старому Spring Security от него же (english)
3. Статья про CSRF
4. Статья про XSS
5. Статья про XXE
6. Доклад Сергея Васильева про XXE на пальцах
7. Простецкая статья про то из чего состоит filter chain
8. Доклад Михаила Вовренчука про OpenID Connect и OAuth2.0
9. Хорошая памятка по JWT
10. Статья про JWT на стороне клиента
11. Воркшоп "Spring Security, demystified by Daniel Garnier Moiroux" (english)
12. Книга "Spring Security in Action" (english)
13. Доклад "Everything new in Spring Security 6 baked with a Spring Boot 3 recipe by Laur Spilca" (english)
14. Официальная документация по Spring Security (english)
15. Официальный репозиторий тестовых примеров Spring Security на GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍46🔥20❤10⚡1🤯1
Какой IDE пользуетесь для разработки на Java/Spring?
Anonymous Poll
25%
IntelliJ IDEA Community
46%
IntelliJ IDEA Ultimate (получаю обновления, сижу на актуальной версии)
26%
IntelliJ IDEA Ultimate (сижу на старой версии с perpetual лицензией)
2%
IntelliJ IDEA EAP
6%
Giga IDE
4%
VS Code
2%
Eclipse
1%
NetBeans
2%
Другой вариант, напишу в комментариях
👍13❤9🔥6😁1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
😁39👍8🔥6👎3
Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!
– Краткая история Java — вспомнили, с чего всё начиналось
– Spring АйО х Amplicode — приняли участие в самом главном событии этой осени для Spring разработчиков
– Underscore в имени Spring Data JPA методов — разобрали один из нюансов, о котором нужно помнить во время написания derived методов
– Подборка лучших материалов по Spring Security — Павел Кислов, эксперт сообщества Spring АйО, собрал все самые полезные материалы воедино
– Какой IDE пользуетесь для разработки на Java/Spring — узнали, какую IDE предпочитают участники нашего сообщества
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥7❤2👎1
Совсем скоро выйдет новая версия Java. Она будет содержать новые функции, улучшения, а некоторые устаревшие элементы будут удалены.
Например, некоторые из тех, что мы обозревали ранее:
- JEP 482: Гибкие конструкторы
- JEP 481: Scoped Values
А также те, про которые мы не успели рассказать (некоторые из них находятся в превью или инкубаторе):
- JEP 455: Примитивные типы в шаблонах pattern matching, instanceof и switch
- JEP 467: Поддержка Markdown в JavaDoc-комментариях
- JEP 476: Импортирование модулей
- JEP 466: Class-File API
- JEP 469: Vector API
- JEP 473: Stream Gatherers
- JEP 474: Сборщик мусора ZGC по умолчанию — generational
- JEP 477: Неявные классы и main-методы экземпляра класса
- JEP 480: Структурированный параллелизм
Подробнее про нововведения читайте в статье: https://axiomjdk.ru/announcements/2024/08/22/Java-23-preview/
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍7❤5
Судя по последнему опросу, бóльшая часть участников нашего сообщества используют IntelliJ IDEA как основную IDE для разработки на Java/Spring. Одной из причин симпатии к этой среде разработки со стороны разработчиков, на наш взгляд, являлись и являются плагины.
Однако несколько дней назад у пользователей с российскими IP-адрессами перестали устанавливаться плагины из официального маркетплейса JetBrains.
При попытке установить плагин появляется следующее сообщение:
К сожалению, в настоящее время мы не можем предоставлять вам наши продукты или услуги из-за правил экспортного контроля.
Решением этой проблемы, как и проблемы со скачиванием IntelliJ IDEA Ultimate, является переход на отличный от российского IP-адресс.
#SpringNews #IntelliJIDEA
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯41🔥13👍9🤔6❤3👎1
С выходом Spring Boot 3.4 логирование станет ещё удобнее: логи можно будет записывать в более унифицированном формате, что упростит их анализ и обработку.
В новом переводе от команды Spring АйО мы разберем основные шаги для настройки и использования этой технологии в проекте.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍6❤2
Одной из часто обсуждаемых тем на собеседованиях по Spring Data JPA является проблема N+1 и возможные способы её решения. Многие отвечают, что её можно решить с помощью
join fetch
или @EntityGraph
. Однако это не всегда так.Оба подхода действительно помогают, но только в простых случаях, когда нужно выбрать все записи из базы данных, как в следующих примерах:
@Query("""
select distinct a
from Author a
left join fetch a.books
""")
List<Author> findAllFetch();
@EntityGraph(attributePaths = {"books"})
@Query("""
select distinct a
from Author a
""")
List<Author> findAllFetch();
Но что если нужно выбрать только часть данных, например, постранично? Тогда запросы будут выглядеть так:
@Query("""
select a
from Author a
left join fetch a.books
""")
Slice<Author> findAllFetch(Pageable page);
@EntityGraph(attributePaths = {"books"})
@Query("""
select distinct a
from Author a
""")
List<Author> findAllFetch(Pageable page);
Проблема в том, что когда мы используем
Pageable
, Hibernate сначала загрузит все записи в память, а затем отсортирует их. Это может привести к OutOfMemoryError
и/или серьёзной деградации производительности.В защиту Hibernate отметим, что столь неоптимизированное действие он не станет выполнять "втихую" и выведет следующий warning в логах:
WARN: HHH000104: firstResult/maxResults specified with collection fetch; applying in memory!
Более того, указав следующее свойство в
application.properties/yaml
, Hibernate и вовсе начнёт падать с JpaSystemException
:
spring.jpa.properties.hibernate.query.fail_on_pagination_over_collection_fetch=true
Как же на самом деле стоит решать проблему N+1?
Правильное решение — использование аннотации
@BatchSize
:
@Entity
public class Owner extends Person {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
@BatchSize(size = 50)
private List<Pet> pets = new ArrayList<>();
}
Если коллекций много, можно настроить глобальный размер выборки в файле
application.properties/yaml
:
spring.jpa.properties.hibernate.default_batch_fetch_size=50
С использованием
@BatchSize
или глобального свойства запросы можно переписать следующим образом:
@Query("""
select a
from Author a
""")
Slice<Author> findAllFetch(Pageable page);
List<Author> findAll(Pageable pageable);
Вывод
Используйте
@BatchSize
или spring.jpa.properties.hibernate.default_batch_fetch_size
, чтобы избежать проблемы N+1 без загрузки избыточного количества данных в память. Стоит отметить, что используя этот подход важно помнить про необходимость обращения к элементам связанной коллекции в условиях наличия открытой транзакции, чтобы Hibernate смог загрузить необходимые данные. Несмотря на то, что
spring.jpa.open-in-view=true
позволяет нам быть уверенными в наличии открытой транзакции, он не является рекомендуемым.Для более глубокого понимания оптимизации запросов рекомендуем ознакомиться с докладом экспертов сообщества Spring АйО – Ильи и Фёдора Сазоновых, с которым они выступали на последнем JPoint.
#SpringTips #JPA #DB
Please open Telegram to view this post
VIEW IN TELEGRAM
❤40👍19🔥15👎1