Spring Bean 生成順序
Spring Beanの生成順序について記述する。
Spring Beanはどのように生成されているのか
順序に関する構成図。
1. Bean definition loaded
Bean definition loadedでは、@Configuration、@Component、@Service等のBeanの定義を読み込みを行う。
読み込み後に、Spring内部実装によってBeanFactoryに登録を行う。
BeanFactoryは、org.springframework.beans
パッケージとorg.springframework.context
パッケージで実装されているJavaBeansを管理するコンテナである。
また、このパッケージでDependency Injectionも実装されている。
2. Post process Bean
Beam情報の再読み込みを行う。
- BeanFactoryProcessorによって、Beanの再読み込みを依存関係の考慮して行う
- カスタムProcessorを実装していた場合、カスタムProcessorによって再読み込み処理を行う
- @Value、@ConfigurationPropertiesのBean読み込みを行う
- 環境変数
- Propertyクラス
3. Instance Bean
Beanのインスタンス生成を行う。
この処理は少し重たい。
4. Setter called
クラスとクラスの依存関係を解決していき、Setterがある場合、Set処理を行う。
5. Before init
@Beforeクラスの初期化処理を行う。
Post process Beanを同じ処理を行うが、Beforeが定義されたクラスのみに適用する。
6. Initializer called
@PostConstructorの実行を行う。
実装していない場合は、この処理フローは特に何もしない。
7. After init
@Afterクラスの初期化処理を行う。
Post process Beanを同じ処理を行うが、Afterが定義されたクラスのみに適用する。
Beanクラスのデザイン
Beanクラスは、デフォルトでSingletonアーキテクチャとなっている。
Beanクラスで利用できるアーキテクチャをまとめる。
Scope | 説明 |
---|---|
Singleton | Singletonパターン。 |
Prototype | 都度インスタンスを生成する。 |
Request | Servlet APIのRequest Scope。 |
Session | Servlet APIのSession Scope。 |
Singleton
Singletonパターンは、常に一つのインスタンスしか存在しないアーキテクチャ。
アプリケーション設計でSingletonパターンを意識すれば、無駄に生成しているインスタンス等があれば省略することができる。
Prototype
Beanを取得する度に新しいインスタンスを生成する。
Singletonでは、常に一つのインスタンスを使い回すが、Prototypeを定義することで、都度インスタンスを作り直してくれる。
Session
Springコンテナは、HTTPSessionライフサイクルのUserPreferences Bean定義を使用し、UserPreferences Beanの新しいスタンスを生成する。
インスタンスの内部状態を変更・管理し、UserPreferences Bean定義で作成されたインスタンスを使用することができる。
内部は複数のHTTPSessionsに対して独立で管理され、HTTPSessionが破棄されると、HTTPSession ScopeのBeanも破棄される。
Request
Springコンテナは、HTTPリクエストごとにLoginAction Bean定義を使用してLoginAction Beanの新しいインスタンスを生成する。
リクエストの内部状態を変更・管理し、LoginAction Bean定義で生成された他のインスタンスを使用することができる。
内部は、リクエストごとに独立で管理され、リクエストの処理が完了すると、Request Scope Beanは破棄される。