Il existe plusieurs façons d'intercepter le processus d'initialisation dans Spring. Si vous devez initialiser tous les beans et les auto-câbler/injecter, il y a au moins deux méthodes que je connais qui permettent de le faire. Je n'ai testé que la seconde mais je pense que les deux fonctionnent de la même manière.
Si vous utilisez @Bean, vous pouvez faire référence à initMethod, comme ceci.
@Configuration
public class BeanConfiguration {
@Bean(initMethod="init")
public BeanA beanA() {
return new BeanA();
}
}
public class BeanA {
// method to be initialized after context is ready
public void init() {
}
}
Si vous utilisez @Component, vous pouvez annoter @EventListener comme suit.
@Component
public class BeanB {
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
}
}
Dans mon cas, j'ai un ancien système pour lequel j'utilise maintenant IoC/DI et Spring Boot est le framework choisi. L'ancien système apporte beaucoup de dépendances circulaires et je dois donc utiliser beaucoup de setter-dependency. Cela m'a donné quelques maux de tête car je ne pouvais pas faire confiance à @PostConstruct puisque l'autowiring/injection par setter n'était pas encore fait. L'ordre est le suivant : constructeur, @PostConstruct puis setter autowired. J'ai résolu le problème avec l'annotation @EventListener qui s'exécute en dernier et au même moment pour tous les beans. L'exemple montre également l'implémentation de InitializingBean.
J'ai deux classes (@Component) qui dépendent l'une de l'autre. Les classes sont identiques pour les besoins de cet exemple qui n'en affiche qu'une seule.
@Component
public class BeanA implements InitializingBean {
private BeanB beanB;
public BeanA() {
log.debug("Created...");
}
@PostConstruct
private void postConstruct() {
log.debug("@PostConstruct");
}
@Autowired
public void setBeanB(BeanB beanB) {
log.debug("@Autowired beanB");
this.beanB = beanB;
}
@Override
public void afterPropertiesSet() throws Exception {
log.debug("afterPropertiesSet()");
}
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
log.debug("@EventListener");
}
}
Voici la sortie du journal montrant l'ordre des appels au démarrage du conteneur.
2018-11-30 18:29:30.504 DEBUG 3624 --- [ main] com.example.demo.BeanA : Created...
2018-11-30 18:29:30.509 DEBUG 3624 --- [ main] com.example.demo.BeanB : Created...
2018-11-30 18:29:30.517 DEBUG 3624 --- [ main] com.example.demo.BeanB : @Autowired beanA
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanB : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanB : afterPropertiesSet()
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanA : @Autowired beanB
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanA : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanA : afterPropertiesSet()
2018-11-30 18:29:30.607 DEBUG 3624 --- [ main] com.example.demo.BeanA : @EventListener
2018-11-30 18:29:30.607 DEBUG 3624 --- [ main] com.example.demo.BeanB : @EventListener
Comme vous pouvez le voir, @EventListener est exécuté en dernier lieu, une fois que tout est prêt et configuré.
0 votes
Voir aussi stackoverflow.com/questions/1088550