Y a-t-il une différence entre l'utilisation de l' @PostConstruct
annotation et la déclaration de la même méthode que init-method
dans la configuration Spring XML?
Non pratiquement, je ne pense pas qu'il y ait de différence, mais il y a des priorités dans leur façon de travailler. @PostConstruct
, init-method
sont des BeanPostProcessors.
@PostConstruct
est une annotation JSR-250, tandis que init-method
Spring utilise une méthode d'initialisation.@PostConstruct
méthode, elle sera appelée avant les méthodes d'initialisation.afterPropertiesSet
, first @PostConstruct
est appelé, puis afterPropertiesSet
et ensuite init-method
.Pour plus d'informations, vous pouvez consulter la documentation de référence de Spring .
Avant les spécifications JSR 250, l'utilisation de la méthode init en xml était la méthode préférée, car elle dissocie les classes Java (beans) de toutes les classes / annotations spécifiques au printemps. alors l'utilisation de la méthode init a été préférée.Pendant la méthode de création, vous pouvez spécifier la méthode à appeler comme méthode d'initialisation.
Désormais, avec l'introduction des spécifications JSR 250 dans Java EE et le support Spring de ces annotations, la dépendance au framework Spring a été réduite dans une certaine mesure.
Mais je dois admettre que l'ajout de ces éléments augmente la lisibilité du code.Il y a donc des avantages et des inconvénients dans les deux approches.
Il n'y a pas de réelle différence. Cela dépend de la façon dont vous préférez configurer votre système, et c'est une question de choix personnel. Moi-même, je préfère utiliser des
@PostConstruct
annotations pour mon propre code (car le bean n'est correctement configuré qu'après l'appel de la méthode) et je l'utiliseinit-method
lors de l'instanciation de beans à partir de bibliothèques non compatibles Spring ( je ne peux pas y appliquer d'annotations, bien sûr!) mais je peux tout à fait comprendre les gens qui veulent tout faire d'une manière ou d'une autre.la source
@postconstruct ne fait pas partie du printemps. Il fait partie du package javax. Les deux sont identiques. en utilisant la méthode init, nous devons l'ajouter dans un fichier xml.Si vous utilisez @postconstruct, l'ajout de xml n'est pas nécessaire. Consultez l'article ci-dessous.
http://answersz.com/spring-postconstruct-and-predestroy/
la source
Comme vous pouvez le voir dans le diagramme ci-dessous du rappel du cycle de vie de la création de bean .
Cette 3 étape se produit dans le rappel du cycle de vie de la création du bean:
@PostConstruct
sera appelé.InitializingBean
est implémenté, alorsafterPropertiesSet()
sera appelé.init-method
ou@Bean(initmethod="..")
alors elle appelle la méthode init.Ce diagramme est tiré de Pro Spring 5: Un guide détaillé sur Spring Framework et ses outils
la source
Il peut y avoir une différence entre
@PostConstruct
etinit-method
car@PostConstruct
est géré dans lapostProcessAfterInitialization
phase d'initialisation du bean (AbstractAutowireCapableBeanFactory.initializeBean()
méthode) parCommonAnnotationBeanPostProcessor
, tandis que lainit
méthode est appelée après la fin de lapostProcessBeforeInitialization
phase (et, pour cette question, avant le début de lapostProcessAfterInitialization
phase).EDIT : Donc, la séquence est: 1)
postProcessBeforeInitialization
phase, 2)init
méthode est appelée, 3)postProcessAfterInitialization
phase, qui appelle la@PostConstruct
méthode(En remarque, une déclaration de la réponse acceptée
n'est pas tout à fait correct:
@PostConstruct
est géré par une méthodeBeanPostProcessor
,init
ne l'est pas.)Il y aura une différence si certains (potentiellement personnalisés)
BeanPostProcessor
, qui sont configurés avec (Ordered.getOrder()
) pour être exécutés aprèsCommonAnnotationBeanPostProcessor
, font quelque chose de sérieux dans leurpostProcessBeforeInitialization
méthode.Il n'y a aucune différence avec la configuration par défaut de Spring
BeanPostProcessors
car tous ceuxBeanPostProcessors
qui sont configurés pour être exécutés aprèsCommonAnnotationBeanPostProcessor
, ne font rien dans lapostProcessBeforeInitialization
méthode.En conclusion, la réponse acceptée et les similaires sont justes ... dans 99% des cas, et ce post est juste pour rendre hommage à un concept "le diable est dans les détails"
la source
Code complet ici: https://github.com/wkaczurba/so8519187 ( spring-boot )
Utilisation des annotations:
Nous obtient:
la source