Spring IoC コンテナの概要
Spring のコントロールインバージョン(IoC)は、依存性注入(DI)とも呼ばれ、オブジェクト間の関係を明示的にコード化する代わりに、設定ファイルや注釈を使用して定義します。このプロセスにより、アプリケーションの柔軟性と保守性が向上します。
BeanFactory と ApplicationContext
`org.springframework.beans` と `org.springframework.context` パッケージは Spring IoC コンテナの基盤です。`BeanFactory` インターフェースは、オブジェクトの高度な構成メカニズムを提供し、`ApplicationContext` はその拡張版として、国際化サポート、イベント通知などの機能を追加しています。
<bean id="example" class="com.example.ExampleClass">
<property name="attributeName" value="value"/>
</bean>
コンテナの初期化
以下のコードは、XML 設定ファイルに基づいてコンテナを初期化する方法を示しています。
ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
Bean 定義とインスタンス化
Spring IoC コンテナでは、アプリケーションの主要部分である Bean を管理します。これらの Bean は XML、Java アノテーション、または Java コードを通じて定義されます。
XML ベースの設定
XML 形式で Bean を定義する場合、以下のように記述します。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="service" class="com.example.ServiceImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class="com.example.DataSourceImpl"/>
</beans>
依存性注入の種類
コンストラクタベース DI
コンストラクタベースの DI は、クラスのコンストラクタを使って依存性を注入します。
public class Service {
private final DataSource dataSource;
public Service(DataSource dataSource) {
this.dataSource = dataSource;
}
}
Setter ベース DI
Setter ベースの DI は、setter メソッドを使って依存性を注入します。
public class Service {
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
Bean の命名と別名
各 Bean には一意の ID が割り当てられますが、必要に応じて複数の別名を持つこともできます。
<bean id="mainService" class="com.example.MainServiceImpl" name="altServiceName, anotherAlias"/>
依存性解決プロセス
Spring コンテナは Bean 間の依存関係を自動的に解決し、必要な順序で Bean を生成します。これは、アプリケーションの複雑さに関わらず、効率的な依存性管理を可能にします。
| 属性 | 説明 |
|---|---|
| class | Bean の実装クラス |
| name | Bean の識別子 |
| scope | Bean のスコープ |
Bean のライフサイクル
Bean のライフサイクルは、初期化から破棄までのプロセスを指します。Spring は、Bean の作成時に初期化メソッドを呼び出し、破棄時にクリーンアップメソッドを呼び出すことができます。
public class ExampleBean implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
// 初期化処理
}
@Override
public void destroy() throws Exception {
// 破棄処理
}
}