У меня есть класс Java Config, которая выглядит примерно так:Порядок загрузки в течение весны Java Config
@Configuration
public class MyConfig {
@Autowired(required = true)
private MyRegistry registry;
public CustomAttributeConfig() {
. . .
}
@Bean
public IBeanApiType someBeanApi() {
return new SomeBeanApi();
}
@PostConstruct
public void postConstructionCodeHere() {
registry.register(someBeanApi());
}
. . .
ли порядок исполнения @Autowired
, @Bean
и @PostConstruct
гарантируется каким-либо образом? Что делать, если @Bean
использует значение реестра @Autowired
?
Порядок исполнения я вижу в моем реальном коде:
- autowired поле
- @PostConstruct аннотированный метод
- @Bean аннотированный метод
Моя цель должен иметь 2 и 3 для выполнения в обратном порядке. Как узнать порядок смесей этих аннотаций в файле конфигурации Java и какие опции доступны для контроля этого заказа?
EDITTED! Мысль об этом еще и пока меня интересует заказ, это может быть не очень важно. Я немного изменил код выше, чтобы отразить тот факт, что я хочу вызвать конструктор @Bean из кода @PostConstruct.
Это, кажется, отлично работает для очень ограниченных тестов, которые я сделал. Кто-нибудь знает, будет ли завершена вся необходимая инициализация Spring, когда вызывается @PostConstruct, так что всегда будет работать вызов аннотированного метода @Bean? Я сделал шаг в вызовы и увидел, что вызываемые перехватчики, но я не знаю, что прокси-сервер, с которым я вернусь, всегда будет «правильным», при этом все советники, советы и т. Д. Должным образом привязаны.
За исключением этого действительно не работает все время. Когда у одного есть много конфигурационных классов для нескольких проектов, «someBeanApi» _can_ получает ссылку, заставляя его строить до компонента «MyConfig» (который делает autowire). Таким образом, PostConstruct выполняет перед autowire. Нет «гарантии». Однако, хотя я видел несколько раз, я никогда не мог воспроизвести в автономном режиме, чтобы представить как ошибку. – JoeG