Означает ли аннотирование компонента @DependsOn, что зависимый компонент будет создан или инициализирован? - PullRequest
8 голосов
/ 11 января 2012

Я использую Spring 3.0.2.У меня есть два относительно простых определения бина.У каждого есть @PostConstruct (bean 'A'), который запускает цепочку событий, к которым должен быть подготовлен bean-компонент @DependsOn (bean 'B').Тем не менее, кажется, что даже несмотря на то, что я заявил, что компонент «A» зависит от компонента «B», события (методы жизненного цикла) компонента «A» выполняются до полной инициализации компонента «B».

Означает ли, что bean-компонент "зависим" через @DependsOn (или, в этом отношении, зависит от-в определении bean-компонента), означает, что методы жизненного цикла зависимого bean-компонента будут завершены до того, как bean-компонент зависит от указанного bean-компонента?

Будут ли завершены методы жизненного цикла компонента 'B' перед компонентом 'A'?

ОБНОВЛЕНИЕ

Элемент A - это пользовательский класс, использующий шаблон JMSотправить сообщение, сообщающее, что он инициализирован.

Получатель указанного сообщения обрабатывает его и пересылает его конфигурацию в MessageListeningContainer (компонент B).

Первая часть происходит до того, как компонент DefaultLifecycleProcessor запускает компонент B.

@Component
@DependsOn("beanB")
public class BeanA {
    @PostConstruct
    public void init() {
        // do stuff
    }
}

<bean id="beanB" class="org.springframework.jms.listener.DefaultMessageListenerContainr">
    <!-- other configuration -->
</bean>

Я добавил в свой метод init внедрение компонента bean b плюс два оператора регистрации:

container.isRunning();
container.isActive();

Я посмотрел на источник пружины, и isActive установлен в true после метода инициализации (doInitialized завершено).IsRunning устанавливается после завершения doStart.DoStart запускается DefaultLifecycleProcessor, который происходит после вызова аннотированных методов @PostConstruct.

Как я могу гарантировать, что мой метод Postconstruct называется AFTER, bean-компонент b был инициализирован и запущен?

1 Ответ

1 голос
/ 11 января 2012

В вашем конкретном случае @PostConstruct метод компонента A не будет вызываться до тех пор, пока B не будет полностью инициализирован, т.е.все его зависимости вводятся, и его @PostConstruct завершает выполнение.

обновлено: поскольку здесь вы полагаетесь на функциональность Spring Lifecycle, вы можете реализовать Lifecycle в A и переместить свой вызов JMS в метод start() там

...