web-dev-qa-db-fra.com

Comment configurer init-method pour un bean quand le ressort est configuré par annotation?

J'utilise spring roo pour construire un projet piloté par les annotations. Il n'existe pas de définition de bean dans un fichier XML. Toutes les informations de configuration sont dans le fichier * .aj.

Et maintenant je veux configurer une méthode init pour un bean qui n'a pas de constructeur par défaut (ce bean provient de la tierce partie et il a un constructeur avec des arguments, et je ne peux pas les supprimer ni lui donner un constructeur par défaut. )

Quelqu'un peut-il me dire comment faire cela, s'il vous plaît?

La raison pour laquelle je veux faire cela est parce que je veux utiliser applicationContext.getBean("thatBeanName") pour obtenir dynamiquement le bean et l'utiliser. Comme le bean n'a pas de constructeur par défaut, j'obtiens toujours l'erreur: Java.lang.NoSuchMethodException: com.to.that.bean.<init>() et c'est pourquoi je veux ajouter la méthode init au bean.

14
Charles

Utilisez @PostConstruct comme indiqué dans l'exemple ci-dessous. C'est équivalent à init-method="initialize()"

@PostConstruct
public void initialize() {
    messages.put("English", "Welcome");
    messages.put("Deutsch", "Willkommen");
}
22
Aravind R. Yarram
@Bean(initMethod="init")
public MyBean getMyBean() {
 ...
}
16
BrentR

Dans le conteneur de printemps, c’est la méthode "init" qui s’appelle le dernier,
@ postconstruct appelé avant afterPropertiesSet. il est donc préférable de ne pas utiliser quelqu'un. "Plusieurs mécanismes de cycle de vie configurés pour le même bean, avec différentes méthodes d’initialisation, sont appelés comme suit:

1.Méthodes annotées avec @PostConstruct

2.afterPropertiesSet () tel que défini par l'interface de rappel InitializingBean

  1. Une méthode init () personnalisée et configurée [ https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-Java-lifecycle-callbacks][1]

Bien que , je préférerais aujourd’hui être plus indépendant de Spring et utiliser soit @Postconstract, soit même configurer la reconnaissance de méthode init par défaut. le fait d'avoir uniquement un nom de méthode significatif indique qu'il doit être utilisé pour l'initialisation - ce qui ressort clairement des cadres, des annotations.

4
magulla

Comme @Pangea l'a fait, @PostConstruct est le meilleur choix. Vous pouvez également implémenter initializingBean et effectuer l’initialisation dans la méthode afterPropertiesSet .Check here pour cette approche.

3
Aravind A

J'ai réalisé qu'il y avait plusieurs réponses pour tenter de résoudre le problème. Mais avec le nouvellement _ introduit @Configuration qui est couramment utilisé dans Spring Boot. Les choses sont un peu modifiées.

Si vous utilisez l'annotation @Bean dans la classe annotée @Configuration comme:

@Configuration
class FooClass {
    @Bean
    public Bar bar() {
        return new Bar();
    }
}

Si vous souhaitez utiliser une méthode appelée automatiquement sur l'instance de bean lors de l'initialisation, vous avez deux options ci-dessous:

Option 1:

@Configuration
class FooClass {
    @Bean(initMethod="init")
    public Bar bar() {
        return new Bar();
    }
}

Option 2:

@Configuration
class FooClass {
    @Bean
    public Bar bar() {
        Bar bar = new Bar();
        bar.init();
        return bar;
    }
}

MAIS, comme expliqué dans @Bean Java Doc ici:

  /**

 * Nom facultatif d'une méthode à appeler sur l'instance de bean lors de l'initialisation. 
 
 * Peu utilisé, cette méthode pouvant être utilisée. appelé directement par programme 
 
 * dans le corps d'une méthode annotée par Bean. 
 
 * La valeur par défaut est {@code ""}, indiquant qu'il n'y a pas de méthode init être appelé.

     */

La seconde est considérée comme une meilleure réponse. Voir lien ici

0
cinqS