web-dev-qa-db-ja.com

Springがアノテーションドリブンによって構成されている場合、Beanのinit-methodを設定するにはどうすればよいですか?

Spring Rooを使用してプロジェクトをビルドすると、アノテーション駆動型であり、XMLファイルにBean定義がありません。すべての構成情報は* .ajファイルにあります。

そして今、デフォルトのコンストラクターがないBeanのinitメソッドを設定したいと思います(そのBeanはサードパーティ製であり、引数を持つコンストラクターがあり、それらを削除したり、デフォルトのコンストラクターを指定したりすることはできません。 )

これを行う方法を教えてくれる人はいますか?

これを実行する理由は、applicationContext.getBean("thatBeanName")を使用して動的にBeanを取得して使用するためです。 Beanにはデフォルトのコンストラクタがないため、常にエラーJava.lang.NoSuchMethodException: com.to.that.bean.<init>()が発生します。これが、Beanにinit-methodを追加したい理由です。

15
Charles

以下の例に示すように、_@PostConstruct_を使用します。 init-method="initialize()"と同等です

_@PostConstruct
public void initialize() {
    messages.put("English", "Welcome");
    messages.put("Deutsch", "Willkommen");
}
_
24
@Bean(initMethod="init")
public MyBean getMyBean() {
 ...
}
19
BrentR

春のコンテナでは最後と呼ばれるのが「init」メソッドで、
@ postconstructはafterPropertiesSetの前に呼び出されます。したがって、誰かが使用を忘れた場合でも安全です。 「同じBeanに対して設定された、異なる初期化メソッドを持つ複数のライフサイクルメカニズムは、次のように呼び出されます。

1. @PostConstructで注釈されたメソッド

2. InitializingBeanコールバックインターフェースで定義されているafterPropertiesSet()

  1. カスタム構成されたinit()メソッド[ https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-Java-lifecycle-callbacks] [1]

ですが、今日は、Springからの独立性を高め、@ Postconstractを使用するか、デフォルトのinitメソッド認識を構成することもできます。意味のあるメソッド名のみを持つことは、それが初期化に使用されるべきであることを示します-フレームワークから、アノテーションから明確。

4
magulla

@Pangeaがに入れたように、 @ PostConstruct が最良の選択です。また、initializingBeanを実装し、afterPropertiesSetメソッド.Check here で初期化を行うこともできます。

3
Aravind A

問題を解決しようとする答えが複数あることに気づきました。しかしnewlyが導入された@ConfigurationSpring Bootで広く使用されています。少し変更されています。

@Beanアノテーション付きクラスで@Configurationアノテーションを使用している場合:

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

初期化中にBeanインスタンスで自動的に呼び出されるメソッドを使用する場合、以下の2つのオプションがあります。

オプション1:

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

オプション2:

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

[〜#〜] but [〜#〜]@Bean Java Docで説明されています)ここに:

 /**

 *初期化中にBeanインスタンスで呼び出すメソッドのオプション名。
 
 *メソッドがプログラムから直接呼び出される
 
 * Beanアノテーション付きメソッドの本体内。
 
 *デフォルト値は{@code ""}であり、initメソッドがないことを示す呼び出される。
 
 * /

2番目はより良い答えと見なされます。リンクを参照 ここ

0
cinqS