Я ожидал, что Spring примет во внимание @DependsOn
при вызове методов @PostConstruct
, но похоже, что это не так в случае использования круговых (авто-проводных) зависимостей.Весна: круговые зависимости, @PostConstruct и порядок, наложенные @DependsOn
Рассмотрите две бобы (код ниже), BeanB @DependsOn BeanA
. Когда поле BeanA#b
имеет это @Autowired
закомментирована, методы пост-конструкт называются в ожидаемом порядке: сначала А, затем B. Но с @Autowired
в силу для А, у меня Б post
называется первым, затем элементов а post
.
Я понимаю, что это плохой дизайн (на самом деле, это минимальная демо очень большой @Autowired
... код базы), но я ожидал, что весна, чтобы закончить инъекцию @Autowired
полей и затем начинают называть жизненным циклом обратных вызовов, почитая @DependsOn
, но весна, кажется, игнорирует @DependsOn
заказ, когда есть круговые отпечатки.
Весенняя версия 4.1.5.
Итак, это моего недоразумения или недокументированного поведение или она может рассматриваться родник ошибкой (или, возможно, запрос функции)?
@Component
class BeanA {
// @Autowired
private BeanB b;
void f() {
System.out.println(this);
}
@PostConstruct
void post() {
System.out.println("A done");
}
@Override
public String toString() {
return "Bean{" +
"b=" + (b == null ? null : b.getClass()) +
'}';
}
}
// ---------------------
@Component
@DependsOn("beanA")
class BeanB {
@Autowired
private BeanA a;
void f() {
System.out.println(this);
}
@PostConstruct
void post() {
System.out.println("B done");
}
@Override
public String toString() {
return "BeanB{" +
"a=" + (a == null ? null : a.getClass()) +
'}';
}
}
Точно - для B существует зависимость побочных эффектов (в полной версии, а не в моем примере кода): на обратном вызове жизненного цикла A необходимо завершить до того, как вызывается собственный '@ PostConstruct' B. И я собирался обеспечить это с помощью '@ DependsOn', но ... увы! –
Реальная проблема с кодом устраняется путем вызова нужной логики из внешнего кода, как только создается контекст контекста, вместо того, чтобы полагаться на 'B # postConstruct()'. –
Я добавил акцент на свое сообщение, чтобы сделать реальный вопрос более явным. –