@Qualifier используется для
Без @Qualifier Spring не знает,
@Bean
@Qualifier("primary")
public DataSource primaryDB() { ... }
@Bean
@Qualifier("secondary")
public DataSource secondaryDB() { ... }
@Autowired
@Qualifier("primary")
private DataSource dataSource;
Альтернатива — использовать
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4👏2
readOnly = true — это
Что происходит:
—
—
—
Важно: это
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥2❤1👏1
Propagation определяет, как транзакция
Основные типы
— REQUIRED (default):
— REQUIRES_NEW:
— MANDATORY:
— NEVER:
— SUPPORTS:
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥1👏1
@RestController — это
Без @RestController пришлось бы
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1🔥1👏1
@Autowired — это аннотация Spring Framework для автоматического внедрения зависимостей. Она может применяться к конструкторам, сеттерам, полям и методам.
Начиная с Spring 4.3, если у класса один конструктор, @Autowired можно
Порядок разрешения зависимостей:
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1🔥1👏1
@Cacheable
Требует
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥2👏1
Actuator предоставляет production-ready функции для
Эндпоинты:
→
→
→
→
Можно создавать кастомные эндпоинты. Важно: закрывайте чувствительные эндпоинты в production через Spring Security.
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👏2❤1🔥1
Spring Data JPA — это
Вместо написания DAO вручную, создаёте интерфейс, и Spring генерирует реализацию.
Поддерживает:
—
—
—
—
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12👏2❤🔥1❤1🔥1
▪️ @Component вешается над
▪️ @Bean ставится над
@Bean полезен, когда:
—
—
Оба способа регистрируют бин в
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1👏1
Spring Bean Scope определяет
Основные виды:
▪️
▪️ prototype —
▪️
▪️ session —
▪️
▪️ websocket —
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1🔥1
ApplicationContext — это
Он является расширением
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1👏1
@Value
@Value("${app.name}")
private String appName;
@Value("${app.timeout:30}")
private int timeout; // 30 - default значение
@Value("#{systemProperties['user.name']}")
private String userName; // SpEL выражениеПоддерживает
— property placeholders ${...}
— SpEL выражения #{...}
— значения по умолчанию через ":"
Альтернатива для группы свойств: @ConfigurationProperties.
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1🔥1
И когда использование 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🔥1
Загружаешь список из 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🔥1
BeanFactory —
ApplicationContext расширяет BeanFactory и добавляет всё, без чего реальное приложение не живёт:
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥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
👍4❤1🔥1