¿Anotar un frijol @dependson significa que el frijol dependiente se instanciará o inicializará?

StackOverflow https://stackoverflow.com/questions/8822712

  •  27-10-2019
  •  | 
  •  

Pregunta

Estoy usando Spring 3.0.2. Tengo dos definiciones de frijoles relativamente simples. Uno tiene un @PostConstruct (Bean 'A') que desencadena una cadena de eventos para los que debe estar preparado el @Dependson Bean (Bean 'B'). Sin embargo, parece que, aunque dije que el frijol 'A' depende de Bean 'B', los eventos (los métodos de ciclo de vida) de Bean 'A' se están ejecutando antes de que Bean 'B' se inicialice por completo.

¿Estar afirmando que un frijol es "dependiente" a través de @dependson (o para el caso, depende de una definición de frijoles) significa que los métodos de ciclo de vida del bean dependiente se completará antes del frijol que depende de dicho frijol?

¿Se completará los métodos de ciclo de vida de Bean 'B' antes de Bean 'A'?

ACTUALIZAR

Bean A es una clase personalizada que está utilizando una plantilla JMS para enviar un mensaje que anuncia que ha inicializado.

El destinatario de dicho mensaje lo procesa y reenvía su configuración a un MessageListeningContainer (frijoles B).

La primera parte está ocurriendo todo antes de que Bean B haya sido iniciado por el defaultLifeCycleProcessor.

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

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

Agregué en mi método init la inyección de Bean B más dos declaraciones de registro:

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

Miré la fuente de primavera y Isactive se establece en verdadero después del método de inicialización (se completa doinitialized). El Isrunning se establece después de que se completa el Dostart. El Dostart se desencadena por el PredettLifeCycleProcessor que ocurre después de que se llaman los métodos anotados @PostConstruct.

¿Cómo puedo garantizar que mi método posterior a la construcción se llame después de que Bean B se haya inicializado y iniciado?

¿Fue útil?

Solución

En tu caso particular @PostConstruct El método de frijoles a no se llamará hasta que B se inicialice completamente, es decir. Se inyectan todas sus dependencias y su @PostConstruct termina de ejecutar.

Actualizado: dado que confía en la funcionalidad del ciclo de vida de la primavera aquí, ¿puede implementar Lifecycle en A y mueve tu llamada JMS a start() método allí?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top