2013-05-03 2 views
3

У меня есть класс 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?

Порядок исполнения я вижу в моем реальном коде:

  1. autowired поле
  2. @PostConstruct аннотированный метод
  3. @Bean аннотированный метод

Моя цель должен иметь 2 и 3 для выполнения в обратном порядке. Как узнать порядок смесей этих аннотаций в файле конфигурации Java и какие опции доступны для контроля этого заказа?

EDITTED! Мысль об этом еще и пока меня интересует заказ, это может быть не очень важно. Я немного изменил код выше, чтобы отразить тот факт, что я хочу вызвать конструктор @Bean из кода @PostConstruct.

Это, кажется, отлично работает для очень ограниченных тестов, которые я сделал. Кто-нибудь знает, будет ли завершена вся необходимая инициализация Spring, когда вызывается @PostConstruct, так что всегда будет работать вызов аннотированного метода @Bean? Я сделал шаг в вызовы и увидел, что вызываемые перехватчики, но я не знаю, что прокси-сервер, с которым я вернусь, всегда будет «правильным», при этом все советники, советы и т. Д. Должным образом привязаны.

ответ

0

Да, в текущей конструкции, где вы используете метод создания bean-компонентов, Spring гарантирует, что этот метод возвращает созданный bean-компонент. И, конечно, гарантирует, что компонент правильно инициализирован

+0

За исключением этого действительно не работает все время. Когда у одного есть много конфигурационных классов для нескольких проектов, «someBeanApi» _can_ получает ссылку, заставляя его строить до компонента «MyConfig» (который делает autowire). Таким образом, PostConstruct выполняет перед autowire. Нет «гарантии». Однако, хотя я видел несколько раз, я никогда не мог воспроизвести в автономном режиме, чтобы представить как ошибку. – JoeG

0

вы можете иметь следующий код внутри вашего SomeBeanApi, а не MyConfig

@Autowired(required = true) 
    private MyRegistry registry; 

    @PostConstruct 
    public void postConstructionCodeHere() { 
     registry.register(this); 
    }