Spring Rooを使用してプロジェクトをビルドすると、アノテーション駆動型であり、XMLファイルにBean定義がありません。すべての構成情報は* .ajファイルにあります。
そして今、デフォルトのコンストラクターがないBeanのinitメソッドを設定したいと思います(そのBeanはサードパーティ製であり、引数を持つコンストラクターがあり、それらを削除したり、デフォルトのコンストラクターを指定したりすることはできません。 )
これを行う方法を教えてくれる人はいますか?
これを実行する理由は、applicationContext.getBean("thatBeanName")
を使用して動的にBeanを取得して使用するためです。 Beanにはデフォルトのコンストラクタがないため、常にエラーJava.lang.NoSuchMethodException: com.to.that.bean.<init>()
が発生します。これが、Beanにinit-methodを追加したい理由です。
以下の例に示すように、_@PostConstruct
_を使用します。 init-method="initialize()"
と同等です
_@PostConstruct
public void initialize() {
messages.put("English", "Welcome");
messages.put("Deutsch", "Willkommen");
}
_
@Bean(initMethod="init")
public MyBean getMyBean() {
...
}
春のコンテナでは最後と呼ばれるのが「init」メソッドで、
@ postconstructはafterPropertiesSetの前に呼び出されます。したがって、誰かが使用を忘れた場合でも安全です。 「同じBeanに対して設定された、異なる初期化メソッドを持つ複数のライフサイクルメカニズムは、次のように呼び出されます。
1. @PostConstructで注釈されたメソッド
2. InitializingBeanコールバックインターフェースで定義されているafterPropertiesSet()
がですが、今日は、Springからの独立性を高め、@ Postconstractを使用するか、デフォルトのinitメソッド認識を構成することもできます。意味のあるメソッド名のみを持つことは、それが初期化に使用されるべきであることを示します-フレームワークから、アノテーションから明確。
@Pangeaがに入れたように、 @ PostConstruct が最良の選択です。また、initializingBeanを実装し、afterPropertiesSetメソッド.Check here で初期化を行うこともできます。
問題を解決しようとする答えが複数あることに気づきました。しかしnewlyが導入された@Configuration
がSpring Bootで広く使用されています。少し変更されています。
@Bean
アノテーション付きクラスで@Configuration
アノテーションを使用している場合:
@Configuration
class FooClass {
@Bean
public Bar bar() {
return new Bar();
}
}
初期化中にBeanインスタンスで自動的に呼び出されるメソッドを使用する場合、以下の2つのオプションがあります。
@Configuration
class FooClass {
@Bean(initMethod="init")
public Bar bar() {
return new Bar();
}
}
@Configuration
class FooClass {
@Bean
public Bar bar() {
Bar bar = new Bar();
bar.init();
return bar;
}
}
[〜#〜] but [〜#〜]、@Bean
Java Docで説明されています)ここに:
/** *初期化中にBeanインスタンスで呼び出すメソッドのオプション名。 *メソッドがプログラムから直接呼び出される * Beanアノテーション付きメソッドの本体内。 *デフォルト値は{@code ""}であり、initメソッドがないことを示す呼び出される。 * /
2番目はより良い答えと見なされます。リンクを参照 ここ