J'utilise Spring 4 avec SpringBoot et Spring-Web avec une configuration Java.
Pour que mes méthodes @PostConstruct
annotated soient exécutées par Spring au lancement, il est nécessaire d’enregistrer CommonAnnotationBeanPostProcessor
avec le contexte, sinon @PostConstruct
est ignoré.
Dans une configuration Spring basée sur XML, la documentation dit d'utiliser (sous l'élément beans)
<context:annotation-config/>
J'ai également vu un exemple où l'enregistrement est effectué sur une base individuelle, comme ceci:
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
Je souhaite éviter cela si possible. Mon projet n'inclut aucun fichier XML et aucun fichier n'est généré pour moi dans mon dossier de construction.
Actuellement, ma solution consiste à annoter ma classe avec @ComponentScan
, ce qui fait que Spring détecte et enregistre @Component
s et @Bean
s. D'une manière ou d'une autre, ceci provoque l'invocation de CommonAnnotationBeanPostProcessor
, bien que je ne sache pas pourquoi, mais cela résout mon problème!
(Cette classe a une propriété @Autowired
, qui est nulle au démarrage - d'où la nécessité de procéder à l'initialisation via @PostConstruct
)
Mais encore une fois, ma question, quel est le moyen approprié de réaliser cela en utilisant la configuration Java? Je vous remercie!
Vous pouvez utiliser InitializingBean comme solution alternative.
Il suffit simplement d’étendre cette interface et de remplacer la méthode afterPropertiesSet qui sera appelée après la définition de toutes les propriétés du bean, comme pour la construction ultérieure.
Par exemple:
@Component
public class MyBean implements InitializingBean
{
@Override
public void afterPropertiesSet()
{
// do whatever you want to do here
}
}
C’est pas une réponse à ma question telle que posée, mais une autre solution alternative.
J'aurais pu implémenter l'interface Lifecycle et initialiser la méthode start()
. À l'époque, je ne savais pas quoi renvoyer pour la méthode isRunning()
, même si, a posteriori, return true
aurait été suffisant, car sa durée de vie est longue. Toute suggestion à ce sujet serait la bienvenue.
public interface Lifecycle {
void start();
void stop();
boolean isRunning();
}
D'autres alternatives peuvent être déduites de ici , à savoir
<beans default-init-method="init">
qui, je suppose, permet chaque @Bean
pour que sa méthode facultative init () soit appelée. (Je ne l'ai pas essayé).
Néanmoins, j'espère une réponse à ma question utilisant la configuration Java.