2009-11-19 8 views
4

Je veux créer un haricot qui a start() et stop() méthodes. Lorsque le contexte de la webapp est actif, start() est appelée pendant le démarrage de Spring. Lorsque la webapp est non déployée ou arrêtée, la méthode stop() est invoquée.Comment lier le cycle de vie d'un bean Spring au cycle de vie des webapps?

Est-ce exact: J'annote ma méthode start() avec @PostConstruct et la méthode stop() avec @PreDestroy?

Normalement, dans le monde des servlets, j'écris un ServletContextListener. Serais-je en mesure d'accéder à ApplicationContext à partir du ServletContextListener?

Répondre

8

Vous pouvez annoter vos méthodes start() et stop() comme vous le décrivez, ou vous pouvez demander à Spring de les invoquer explicitement, par ex.

<bean class="MyClass" init-method="start" destroy-method="stop"/> 

Quant au ServletContextListener, il ne serait pas un accès facile au contexte du printemps. Il est préférable d'utiliser le propre cycle de vie de Spring pour effectuer l'initialisation de votre bean.

10

Mettre en oeuvre les Lifecycle ou SmartLifecycle interfaces dans votre haricot, comme décrit dans

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lifecycle-processor

public interface Lifecycle { 
    void start(); 
    void stop(); 
    boolean isRunning(); 
} 

Votre ApplicationContext sera alors en cascade le démarrage et l'arrêt des événements à toutes les implémentations du cycle de vie. Voir aussi la JavaDocs:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/Lifecycle.html

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/SmartLifecycle.html