[解決済み] Spring BeanPostProcessorは具体的にどのように動作するのですか?
質問
Spring Coreの資格取得に向けて勉強しているのですが、Springがどのようにを処理するかについて疑問があります。 ビーンズライフサイクル をどのように扱うのか、特に ビーンポストプロセッサ .
というわけで、こんなスキーマができました。
その意味は私にとってかなり明確です。
次のような手順で ビーン定義の読み込み フェーズで行われます。
-
は コンフィギュレーション クラスが処理され、かつ/または コンポーネント は がスキャンされ、かつ XML ファイル がパースされます。
-
BeanFactoryに追加されたBean定義(それぞれidでインデックス化されています。)
-
特別な BeanFactoryPostProcessor ビーンが呼び出されると、任意のビーンの定義を変更することができます (たとえば、プロパティ・プレースホルダーの値の置換など)。
次に、以下の手順で ビーンズの作成フェーズ :
-
各Beanはデフォルトでイーガーリーインスタンス化されます(依存関係が注入された状態で正しい順序で作成されます)。
-
依存性注入の後、各Beanは後処理フェーズを通過します。 このフェーズでは、さらなる構成と初期化が行われる可能性があります。
-
後処理の後、Beanは完全に初期化され、使用できるようになります(コンテキストが破棄されるまで、そのidによって追跡されます)。
OK、これは私にとってかなり明確です。 ビーンポストプロセッサには2つのタイプがあります。 であることも知っています。
-
イニシャライザーです。 指示があればビーンを初期化します(@PostConstructなど)。
-
そして 残りはすべて という追加設定を可能にするもので、その は初期化ステップの前でも後でも実行することができます。
そして、このスライドを投稿します。
というのは、私にとって非常に明確なことです。 初期化子 でアノテーションされたメソッドです。 ポストコンストラクト アノテーションがあり、セッターメソッドの直後(つまり依存性注入の後)に自動的に呼び出されるメソッドで、私はいくつかの初期化バッチを実行するために使用できることを知っています(前の例のようにキャッシュを移入するように)。
しかし、もう一つのビーンポストプロセッサは一体何を表しているのでしょうか?これらのステップが実行されると言ったとき、私たちは何を意味するのでしょうか。 初期化フェーズの前または後に実行される ?
私のBeanはインスタンス化され、依存関係が注入され、そして初期化フェーズが完了します。 ポストコンストラクト アノテーションされたメソッドの実行によって) 完了します。Bean Post Processorが初期化フェーズの前に使用されるというのはどういうことでしょうか。それは ポストコンストラクト アノテーションされたメソッドの実行の前に起こるということですか?依存性注入の前(セッターメソッドが呼ばれる前)に起こる可能性があるということでしょうか?
そして、それが実行されると言うとき、私たちは正確に何を意味するのでしょうか? 初期化ステップの後 . の実行の後に行われるということです。 @PostContruct アノテーションされたメソッドの実行後ということでしょうか?
が必要な理由は簡単に頭で理解できます。 ポストコンストラクト アノテーションされたメソッドが必要な理由は簡単に理解できますが、他の種類のビーンポストプロセッサの典型的な例を理解できません。
どのように解決するには?
Springのドキュメントでは、以下のBPPを説明しています。
BeanPostProcessorを使用したBeanのカスタマイズ
. BPPビーンは、他のビーンより先に作成され、新しく作成されたビーンと相互作用する特別な種類のビーンです。この構成で、Springは、単に
BeanPostProcessor
を実装するだけで、ライフサイクルの動作にフックし、カスタマイズする手段を提供します。
のようなカスタムBPPを持つことは
public class CustomBeanPostProcessor implements BeanPostProcessor {
public CustomBeanPostProcessor() {
System.out.println("0. Spring calls constructor");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println(bean.getClass() + " " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println(bean.getClass() + " " + beanName);
return bean;
}
}
が呼び出され、作成されたすべてのビーンについてクラスとビーン名が出力されます。
メソッドがビーンのライフサイクルにどのように適合し、いつメソッドが呼び出されるかを理解するために、以下のサイトをチェックしてください。 ドキュメント
postProcessBeforeInitialization(Object bean, String beanName) 適用する このBeanPostProcessorを、与えられた新しいBeanインスタンスに適用します。 初期化コールバック(InitializingBeanのafterPropertiesSetのような) またはカスタムinit-methodのような)前に、この新しいBeanPostProcessorを適用します。
postProcessAfterInitialization(Object bean, String beanName) 適用する このBeanPostProcessorを与えられた新しいBeanインスタンスに適用します。 初期化コールバック(InitializingBeanのafterPropertiesSetのような)の後に、このBeanPostProcessorを与えられた新しいBeanインスタンスに適用します。 またはカスタムinit-methodのような)任意のビーン初期化コールバックの後に、このBeanPostProcessorを適用します。
また、重要なビットは
<ブロッククオートビーンにはすでにプロパティ値が入力されていることでしょう。
との関係に関わるものについては
@PostConstruct
を宣言するのに便利なアノテーションであることに注意してください。
postProcessAfterInitialization
メソッドを宣言する便利な方法であり、Springがそれを認識するのは、あなたが
CommonAnnotationBeanPostProcessor
を指定するか
<context:annotation-config />
をビーン設定ファイルで指定します。を指定するか、あるいは
@PostConstruct
メソッドの前か後に実行されるか。
postProcessAfterInitialization
は
order
プロパティに依存します。
複数のBeanPostProcessorインスタンスを構成することができます。 を設定することで、これらのBeanPostProcessorが実行される順序を制御することができます。 を設定することで、これらのBeanPostProcessorの実行順序を制御できます。
関連
-
[解決済み] Springのオートワイヤリングの仕組みは?
-
[解決済み] 春豆っていったい何?
-
[解決済み】フィールド・インジェクションとは何ですか、またそれを回避する方法は?
-
[解決済み】Spring MVCのApplicationContextとWebApplicationContextの違いは何ですか?
-
[解決済み] 同じインタフェースを実装する2つのビーンを自動配線する - 自動配線するデフォルトのビーンを設定する方法は?
-
[解決済み] クラスを@Componentでアノテートした場合、Spring BeanとSingletonということになるのでしょうか?
-
[解決済み] Spring Data JPAでネイティブクエリ結果をNon-Entity POJOにマップする。
-
[解決済み] Spring Hibernate - 現在のスレッドでトランザクションに同期したセッションを取得できませんでした。
-
[解決済み] java:comp/env/は何をするところですか?
-
[解決済み] Spring @PostConstruct と init-method 属性の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Springのセキュリティ認証の例外を@ExceptionHandlerで処理する
-
[解決済み] Spring Data JPAでネイティブクエリ結果をNon-Entity POJOにマップする。
-
[解決済み] Spring Hibernate - 現在のスレッドでトランザクションに同期したセッションを取得できませんでした。
-
[解決済み] Spring Boot Rest Controllerは、異なるHTTPステータスコードを返すには?
-
[解決済み] 複数のBeanが見つかった場合、Springはどのように名前による自動配線を行うのですか?
-
[解決済み] java:comp/env/は何をするところですか?
-
[解決済み] Spring Dataです。"delete by "はサポートされていますか?
-
[解決済み] Spring Boot JPA - 自動再接続の設定
-
[解決済み] 同じurlパターンに対して異なる引数で2つのメソッドを作成する
-
[解決済み] Spring BootとMongoDBへの接続設定方法