Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
зачем может понадобиться посередине одной транзакции создавать другуюНе так уж редко это нужно. У нас используется в таких ситуациях:
посчитатьЗаОдинМесяц() стоит аннотация @Transactional(propagation = Propagation.REQUIRES_NEW), и этот метод вызывается в цикле. Если считать несколько месяцев в одной транзакции, то соединение с базой разрывается по таймауту.перед select-ом второй объект автоматически сохраняется, даже если он неправильный
посчитатьЗаОдинМесяц() над котороым стоит Propagation.REQUIRED (ну или никакой propagation вообще не указываем, поскольку это дефолтный). Метод закончился, траннзакция комитнулась. Следующий вызов — новая транзакция.@Transactional (с default propagation). И есть третий сервис (агрегатор), нетранзакционный. Он вызывает метод бизнес логики, тот в свою очередь (выполнив своючасть работы) вызывает логер. Если они нормально отрабатывают, то в одной транзакции завершают свою работу. Если они падают (неважно кто виноват, бизнес или логи) то агрегатор по try catch ловит этот случай и уже сам пытается воспользоваться сервисом логов.@Configuration
public class Cfg {
@Bean
public A a() {
System.out.println("here");
return new A();
}
@Bean
public B b(A a) {
// каноничная инъекция
return new B(a);
}
@Bean
public C c() {
// this - proxy, this.a() ~ ctx.getBean()
return new C(a());
}
}
Тут все по-настоящему, CGLib обертка не прикидывается, что уважает ООП.
спринг и таких бережет :)
С помощью CGLib создается класс наследник и дальше все как положено: наследование, полиморфизм…
Помимо инжектирования компонента в самого себя, еще можно заюзать AopContext и достать оттуда ссылку на проксю.
Что заинжектить бин в самого себя нужно использовать @Lazy
@Lazy
@Autowired
private MyServiceImpl myService;все равно не понятно: а почему связывание по месту исполнения не дает выполниться аннотации около method2 ?
Spring AOP. Маленький вопросик с собеседования