Ответ
Лекции Евгения Борисова ценны глубоким архитектурным анализом внутренней работы Spring Framework, выходящим за рамки стандартной документации. Он объясняет не "как", а "почему" работают те или иные механизмы.
Ключевые темы и insights:
- Принцип работы прокси в Spring AOP: Почему
@Transactional,@Cacheableи другие аннотации не работают на private-методах и при внутренних вызовах внутри одного бина. - Жизненный цикл бина и ApplicationContext: Детали инициализации, пост-процессоры, фабрики бинов.
- Сравнение различных типов прокси: JDK Dynamic Proxy vs CGLIB, их ограничения и выбор.
Наглядный пример проблемы с @Transactional:
@Service
public class InvoiceService {
public void createInvoice(Order order) {
// Этот вызов работает через прокси, транзакция создается.
saveInvoice(order);
// Этот вызов НЕ будет выполнен в транзакции!
updateInternalStats(order); // Вызов внутри того же объекта, минуя прокси.
}
@Transactional
public void saveInvoice(Order order) {
// Логика сохранения в БД
}
@Transactional
private void updateInternalStats(Order order) {
// Этот метод никогда не будет выполнен в транзакции по двум причинам:
// 1. Прокси не может перехватить вызовы private-методов.
// 2. Даже если бы он был public, вызов из createInvoice() происходит "внутри" бина.
}
}
Решение: Выносить @Transactional-методы в отдельный бин или использовать AspectJ mode для weaving'а на уровне байт-кода.
Его разборы помогают избегать скрытых ошибок, правильно проектировать приложения и глубже понимать инструмент, что критически важно для senior-разработчиков.