web-dev-qa-db-fra.com

Comment appeler une méthode une fois l'initialisation du bean terminée?

J'ai un cas d'utilisation où j'ai besoin d'appeler une méthode (non statique) dans le bean une seule fois lors du chargement de ApplicationContext. Est-ce correct si j'utilise MethodInvokingFactoryBean pour cela? Ou nous avons une meilleure solution?

En guise de remarque, j'utilise ConfigContextLoaderListener pour charger le contexte d'application dans une application Web. Et vous voulez que si le bean 'A' est instancié, appelez simplement methodA () une fois.

Comment cela peut-il être fait gentiment?

225
peakit

Vous pouvez utiliser quelque chose comme:

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

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

196
Mercer Traieste

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

  • Cela maintient votre code découplé de l'API Spring (@PostConstruct est en javax. *)
  • Il annote explicitement votre méthode init en tant que chose qui doit être appelée pour initialiser le bean
  • Vous n'avez pas besoin de vous rappeler d'ajouter l'attribut init-method à votre définition du bean spring, spring appellera automatiquement la méthode (en supposant que vous enregistriez l'option annotation-config ailleurs dans le contexte).
300
skaffman

Il existe trois approches différentes à considérer, comme décrit dans le référence

Utiliser l'attribut init-method

Avantages:

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

Les inconvénients:

  • Aucune indication immédiate cette méthode n'est requise après la construction pour s'assurer que le bean est correctement configuré.

Implémenter InitializingBean

Avantages:

  • Pas besoin de spécifier init-method, ni d'activer le traitement de numérisation/annotation de composant.
  • Convient aux beans fournis avec une bibliothèque, lorsque nous ne voulons pas que l'application utilisant cette bibliothèque se préoccupe du cycle de vie des beans.

Les inconvénients:

  • Plus invasive que l'approche init-method.

Utilisez JSR-250 @ PostConstruct annotation de cycle de vie

Avantages:

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

Les inconvénients:

  • L'initialisation n'est plus spécifiée de manière centralisée dans la configuration.
  • Vous devez vous rappeler d'activer le traitement des annotations (qui peuvent parfois être oubliés)
101
toolkit

Avez-vous essayé d'implémenter InitializingBean ? Cela ressemble exactement à ce que vous recherchez.

L'inconvénient est que votre bean devient Spring-aware, mais dans la plupart des applications, ce n'est pas si grave.

38
Jon Skeet

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

8
Rob H