SpringアノテーションでDIを実装する
Bean設定ファイルを使用せず、クラスへアノテーションを追加してBeanを使用できます。これはBeanとコンポーネントを使用する基本的な方法です。
アノテーションによるBean制御
設定方式はXMLファイルからアノテーションへ移行しています。アノテーションは、@Overrideのようにクラス、メソッド、フィールドの宣言へ記述する@で始まるテキストです。
Springは設定ファイル方式とアノテーション方式の両方をサポートします。ここではアノテーション方式を説明します。
Bean設定クラスを作成する
アノテーション方式では、Bean設定ファイルの代わりにJavaクラスを使用します。
package com.devkuma.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SampleBeanConfig {
@Bean
public SampleBeanInterface sampleBean() {
return new SampleBean("設定クラスで作成したインスタンスです。");
}
}
@ConfigurationはBeanを設定するクラスであることを示します。@BeanはBeanインスタンスを作成するメソッドを示します。メソッドはBeanを返す必要があります。
Appクラスを修正する
ApplicationContext app =
new AnnotationConfigApplicationContext(SampleBeanConfig.class);
SampleBeanInterface bean1 =
app.getBean(SampleBeanInterface.class);
System.out.println(bean1);
AnnotationConfigApplicationContextは設定クラスからApplicationContextを作成します。getBean()へ目的のクラスを渡してBeanを取得します。
コンポーネントを作成して使用する
コンポーネントを作成する
Springでは、より高度な処理を持つクラスをコンポーネントとして定義し、Beanのように使用できます。
package com.devkuma.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class BeanHolder {
@Autowired
private SampleBeanInterface bean;
public void showMessage() {
System.out.println("*print by BeanHolder*");
System.out.println(bean);
System.out.println("*end*");
}
}
@Componentはクラスがコンポーネントであることを示します。@Autowiredは互換性のあるBeanを検索し、自動的に割り当てます。
SampleBeanConfigへ@ComponentScanを追加します。Springがコンポーネントを検索し、インスタンスを作成してApplicationContextへ登録します。
コンポーネントを使用する
ApplicationContext app =
new AnnotationConfigApplicationContext(SampleBeanConfig.class);
BeanHolder holder = app.getBean(BeanHolder.class);
holder.showMessage();
BeanHolderは設定クラスへ直接記述されていませんが、@ComponentScanが@Componentを検出します。内部のフィールドには@AutowiredによってSampleBeanが注入されます。
アノテーションを使用すると、必要なBeanとコンポーネントをSpringが自動的に作成して接続します。DIとBean管理はSpring Frameworkの基礎です。