И когда использование NESTED может неожиданно упасть?
REQUIRES_NEW —
NESTED —
1. JPA + Hibernate
2. База не умеет savepoints
3. Self-invocation
// proxy не задействован → NESTED полностью игнорируется
this.nestedMethod();
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🔥1
Self-invocation убивает прокси
Spring создаёт AOP-прокси вокруг бина. Когда ты вызываешь this.sendEmail(),
private метод — та же история.
CGLIB-прокси не может переопределить private метод. Spring
⚠️ Ещё один подводный камень
Исключения внутри @Async метода
📌 Как правильно
—
—
—
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3🔥2
Загружаешь список из N сущностей, а потом для каждой Hibernate
// Загружаем 100 заказов — получаем 101 запрос
List<Order> orders = orderRepo.findAll();
orders.forEach(o -> o.getItems().size()); // LAZY — N запросов здесь
JOIN FETCH vs @EntityGraph
JOIN FETCH — пишешь в JPQL явно:
@Query("SELECT o FROM Order o JOIN FETCH o.items WHERE o.status = :s")
List<Order> findWithItems(@Param("s") Status s);Гибко, но размножается: для каждой комбинации связей нужен свой метод.
@EntityGraph — декларативно, переиспользуемо:
@EntityGraph(attributePaths = {"items", "items.product"})
List<Order> findByStatus(Status status);JOIN FETCH с коллекциями →
@EntityGraph → на больших данных легко
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥2
BeanFactory —
ApplicationContext расширяет BeanFactory и добавляет всё, без чего реальное приложение не живёт:
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥1😁1
@Conditional регистрирует бин только при
@Bean
@Conditional(WindowsCondition.class)
public Service windowsService() {
return new WindowsService();
}
class WindowsCondition implements Condition {
public boolean matches(ConditionContext context,
AnnotatedTypeMetadata metadata) {
return System.getProperty("os.name")
.contains("Windows");
}
}
Spring Boot предоставляет готовые: @ConditionalOnProperty, @ConditionalOnClass, @ConditionalOnMissingBean.
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1
Основные этапы:
1.
2.
3.
4.
5.
6.
7.
8.
При завершении контекста:
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
Потому что @Transactional работает через
Если же метод класса вызывает другой @Transactional-метод того же класса напрямую (this.method()), вызов идёт
Решения:
-
-
-
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1👏1
Для синглтонов с внедрением через поля или сеттеры через
А вот при внедрении через конструктор цикл разрешить
Лучшее решение —
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥1
Оба регистрируют бин в контейнере, но по-разному:
@Component (и специализации @Service, @Repository, @Controller) вешается на
@Bean вешается на
→
→
→
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3👏1
AOP выносит
Advice срабатывает только при вызове через прокси. Отсюда ограничения:
→
→
→
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1👏1
BeanFactory —
ApplicationContext расширяет BeanFactory и добавляет почти всё, чем пользуются на практике:
—
—
—
—
—
В реальных приложениях используют
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1👏1
Propagation — политика того, как метод с аннотацией @Transactional будет взаимодействовать с
Виды:
▪️ REQUIRED (по умолчанию
▪️ REQUIRES_NEW:
▪️ SUPPORTS:
▪️ MANDATORY:
▪️ NEVER:
▪️ NESTED:
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1