web-dev-qa-db-fra.com

Quelle est la bonne façon d'activer @PostConstruct via CommonAnnotationBeanPostProcessor via une configuration Java?

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 @Components et @Beans. 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!

12
zkn

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
    }
}
8
Braj

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.

0
zkn