Réponses:
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'utilise init-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.
@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.
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é, alors afterPropertiesSet()
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
Il peut y avoir une différence entre @PostConstruct
et init-method
car @PostConstruct
est géré dans la postProcessAfterInitialization
phase d'initialisation du bean ( AbstractAutowireCapableBeanFactory.initializeBean()
méthode) par CommonAnnotationBeanPostProcessor
, tandis que la init
méthode est appelée après la fin de la postProcessBeforeInitialization
phase (et, pour cette question, avant le début de la postProcessAfterInitialization
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
@PostConstruct, init-method sont des BeanPostProcessors
n'est pas tout à fait correct: @PostConstruct
est géré par une méthode BeanPostProcessor
, 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ès CommonAnnotationBeanPostProcessor
, font quelque chose de sérieux dans leur postProcessBeforeInitialization
méthode.
Il n'y a aucune différence avec la configuration par défaut de Spring BeanPostProcessors
car tous ceux BeanPostProcessors
qui sont configurés pour être exécutés après CommonAnnotationBeanPostProcessor
, ne font rien dans la postProcessBeforeInitialization
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"
Code complet ici: https://github.com/wkaczurba/so8519187 ( spring-boot )
Utilisation des annotations:
@Slf4j
@Component
public class MyComponent implements InitializingBean {
@Value("${mycomponent.value:Magic}")
public String value;
public MyComponent() {
log.info("MyComponent in constructor: [{}]", value); // (0) displays: Null
}
@PostConstruct
public void postConstruct() {
log.info("MyComponent in postConstruct: [{}]", value); // (1) displays: Magic
}
@Override // init-method; overrides InitializingBean.afterPropertiesSet()
public void afterPropertiesSet() {
log.info("MyComponent in afterPropertiesSet: [{}]", value); // (2) displays: Magic
}
@PreDestroy
public void preDestroy() {
log.info("MyComponent in preDestroy: [{}]", value); // (3) displays: Magic
}
}
Nous obtient:
Actualisation de org.springframework.context ...
MyComponent in constructor: [null]
MyComponent in postConstruct: [Magic]
MyComponent in afterPropertiesSet: [Magic]
...
Enregistrement de beans pour l'exposition JMX au démarrage
DémoApplication démarrée en 0,561 seconde (JVM en cours d'exécution pour 1.011)
Fermeture de org.springframework.context .. . Annulation de l’enregistrement des beans exposés à JMX lors de l’arrêt
…
MyComponent in preDestroy: [Magic]