Comment appeler une méthode après l'initialisation du bean est terminée?

J'ai un cas d'utilisation où je dois appeler une méthode (non statique) dans le bean seulement-une fois à la charge ApplicationContext. Est-ce correct, si j'utilise MethodInvokingFactoryBean pour cela? Ou nous avons une meilleure solution?

Comme note de côté, J'utilise ConfigContextLoaderListener pour charger le contexte D'Application dans l'application web. Et voulez, que si bean ' A ' est instancié, appelez methodA () une fois.

Comment cela peut-il être bien fait?

211
demandé sur BalusC 2009-07-06 22:31:48

6 réponses

Vous pouvez utiliser quelque chose comme:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

Cela appellera la méthode "init" lorsque le bean est instancié.

191
répondu Mercer Traieste 2013-04-12 09:38:01

Pour développer la suggestion @ PostConstruct dans d'autres réponses, c'est vraiment la meilleure solution, à mon avis.

  • il garde votre code découplé de L'API Spring (@PostConstruct est dans javax.*)
  • il annote explicitement votre méthode init comme quelque chose qui doit être appelé pour initialiser le bean
  • vous n'avez pas besoin de vous rappeler d'ajouter l'attribut init-method à votre définition spring bean, spring appellera automatiquement la méthode (en supposant que vous enregistrez le annotation-config option ailleurs dans le contexte, de toute façon).
280
répondu skaffman 2016-03-01 12:28:48

Il y a trois approches différentes à considérer, comme décrit dans la référence

Utiliser l'attribut init-method

Avantages:

  • ne nécessite pas bean pour implémenter une interface.

Inconvénients:

  • aucune indication immédiate cette méthode est nécessaire après la construction pour s'assurer que le haricot est correctement configuré.

Implémente InitializingBean

Avantages:

  • Pas besoin de spécifier INIT-méthode, ou activer numérisation des composants / traitement des annotations.
  • approprié pour les beans fournis avec une bibliothèque, où nous ne voulons pas que l'application utilisant cette bibliothèque se préoccupe du cycle de vie des beans.

Inconvénients:

  • plus invasive que l'approche de la méthode init.

Utiliser JSR-250 @ PostConstruct lifecyle annotation

Avantages:

  • utile lors de l'utilisation de l'analyse de composants pour détecter automatiquement les beans.
  • indique clairement qu'un une méthode spécifique doit être utilisée pour l'initialisation. L'intention est plus proche du code.

Inconvénients:

  • L'Initialisation n'est plus spécifiée centralement dans la configuration.
  • Vous devez vous rappeler d'activer le traitement des annotations (qui peut parfois être oublié)
91
répondu toolkit 2016-05-19 10:24:33

Avez-vous essayé de mettre en œuvre InitializingBean? Il ressemble exactement à ce que vous êtes après.

L'inconvénient est que votre haricot devient sensible au printemps, mais dans la plupart des applications, ce n'est pas si mal.

36
répondu Jon Skeet 2009-07-06 18:35:28

Vous pouvez déployer un BeanPostProcessor personnalisé dans votre contexte d'application pour le faire. Ou si cela ne vous dérange pas d'implémenter une interface Spring dans votre bean, vous pouvez utiliser l'interfaceInitializingBean ou la directive "init-method" (même lien).

8
répondu Rob H 2009-07-06 18:35:49

Pour effacer davantage toute confusion sur les deux approches, c'est-à-dire l'utilisation de

  1. @PostConstruct et
  2. init-method="init"

Par expérience personnelle, j'ai réalisé que l'utilisation de (1) ne fonctionne que dans un conteneur de servlet, tandis que (2) fonctionne dans n'importe quel environnement, même dans les applications de bureau. Donc, si vous utilisiez Spring dans une application autonome, vous devrez utiliser (2) pour effectuer "appeler cette méthode après l'initialisation.

-7
répondu Ayorinde 2014-09-24 10:25:18