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の基礎です。