Bean管理コンポーネント
Spring Frameworkのorg.springframework.beansパッケージに定義されているBeanコンポーネントは、典型的なファクトリパターン(BeanFactory)を実装しています。このコンポーネントは以下の3つの主要な機能を提供します:
- Bean定義の管理
- Beanインスタンスの生成
- 依存性注入と初期化処理
Beanの生成プロセス
Beanの生成プロセスは以下のステップで行われます:
- BeanDefinitionの作成:@Configurationまたは@Beanアノテーションを使用してBean定義を作成し、クラス情報や識別子をカプセル化します
- インスタンス生成:リフレクションを使用してBeanオブジェクトを生成します(この時点では依存性注入前の状態)
- 依存性解決と初期化:循環依存の解決と初期化処理を実行し、完全なBeanオブジェクトをIOCコンテナに登録します
SpringのBean管理はBeanFactoryインターフェースを頂点とするファクトリパターンで実装されています。BeanFactory.getBean("beanName")メソッドを使用してBeanインスタンスを取得できます。
BeanDefinitionの実装
BeanDefinitionはSpring Framework内でBean情報を表現するオブジェクトです。開発者が定義した各Beanは、内部的にBeanDefinitionオブジェクトに変換されて管理されます。
public class BeanDefinitionRegistryImpl
extends AbstractBeanFactory
implements ConfigurableBeanFactory, BeanDefinitionRegistry {
private final Map<String, BeanDefinition> beanDefinitions =
new ConcurrentHashMap<>(256);
}
BeanDefinitionオブジェクトには、Beanが参照するクラス情報、シングルトン設定、遅延ロード設定、依存Bean情報などが保存されます。
Contextコンポーネント
Contextモジュールはorg.springframework.contextパッケージに配置され、CoreおよびBeansモジュールを基盤として構築されています。このモジュールは、国際化、イベント伝播、リソースロードなどの機能を提供します。
ApplicationContextはContext階層の最上位インターフェースであり、以下の主要な機能を担当します:
- アプリケーション環境の識別
- BeanFactoryを使用したBeanオブジェクトの生成
- オブジェクト関係テーブルの管理
- 各種イベントの捕捉と処理
コンテナの種類と特性
ApplicationContextは高度なコンテナオブジェクトであり、構築時にすべての非遅延ロードのシングルトンBeanを生成します。一方、BeanFactoryは基本的なコンテナオブジェクトで、遅延ロードをサポートします。
// 遅延ロードの例
BasicBeanFactory factory = new BasicBeanFactory();
factory.getBean("beanName");
// 即時ロードの例
new AnnotationConfigApplicationContext();
後処理機構の拡張ポイント
Spring FrameworkはBeanライフサイクル全体にわたる拡張メカニズムとして、後処理機構を提供しています。
BeanFactory後処理器
BeanFactoryPostProcessorインターフェースを実装することで、SpringがBeanを生成する前にBean定義プロパティを変更できます。
public interface BeanFactoryPostProcessor {
void processBeanFactory(ConfigurableListableBeanFactory factory)
throws BeansException;
}
Bean後処理器
BeanPostProcessorはSpring IOCコンテナが提供する拡張インターフェースで、Beanインスタンス化後の初期化メソッド実行前後に処理ロジックを追加できます。
public interface BeanPostProcessor {
Object preProcessInitialization(Object beanInstance, String identifier)
throws BeansException;
Object postProcessInitialization(Object beanInstance, String identifier)
throws BeansException;
}
実行順序
後処理器の実行順序は以下の通りです:
- Spring IOCコンテナによるBeanのインスタンス化
- BeanPostProcessorのpreProcessInitializationメソッド呼び出し
- Beanインスタンスの初期化メソッド実行
- BeanPostProcessorのpostProcessInitializationメソッド呼び出し