Spring Bean 生成順序

2017/12/07

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情報の再読み込みを行う。

  1. BeanFactoryProcessorによって、Beanの再読み込みを依存関係の考慮して行う
    • カスタムProcessorを実装していた場合、カスタムProcessorによって再読み込み処理を行う
  2. @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は破棄される。