Springの完全注解ベース設定によるBean管理

Springフレームワークでは、従来XMLファイル(例:applicationContext.xml)にBean定義を記述していましたが、アノテーションを使用することでその必要がなくなります。Springは特定のパッケージをスキャンし、クラスやメソッドに付与されたアノテーションに基づいて自動的にBeanを登録・注入します。これにより設定ファイルの肥大化を防ぎ、コードベースの設定が可能になります。

@Configuration

@Configuration アノテーションは、JavaクラスをSpringの設定クラスとして扱うために使用されます。このクラスはXML設定ファイルの代替となり、@ComponentScan と組み合わせてBeanのスキャン範囲を指定できます。

@Configuration
@ComponentScan(basePackages = "com.minelsh")
public class AppConfig {
}

Bean登録用アノテーション

以下のアノテーションはクラスに付与することで、そのクラスをSpringコンテナが管理するBeanとして登録します。

  • @Component:汎用的なコンポーネント
  • @Controller:MVCのコントローラ層
  • @Service:ビジネスロジック層
  • @Repository:データアクセス層(DAO)

@Componentの基本使用例

@Component("conversionImpl")
public class ConversionImpl implements Conversion {
}

Bean名を明示しない場合、クラス名の先頭を小文字にしたものがデフォルトIDとなります(例:University → university)。

Bean取得方法

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
University uni = ctx.getBean("university", University.class);

依存性注入:@Autowired

@Autowired は型(byType)に基づいて依存オブジェクトを自動注入します。フィールド、コンストラクタ、セッターメソッド、任意のメソッドに適用可能です。

コンストラクタ注入

public class MovieRecommender {
    private final CustomerPreferenceDao dao;

    @Autowired
    public MovieRecommender(CustomerPreferenceDao dao) {
        this.dao = dao;
    }
}

フィールド注入

public class MovieRecommender {
    @Autowired
    private MovieCatalog catalog;
}

コレクション注入

public class MovieRecommender {
    @Autowired
    private List<MovieCatalog> catalogs;
}

@Qualifierによる詳細制御

同じインターフェースを実装する複数のBeanが存在する場合、@Autowired だけでは曖昧さが生じます。@Qualifier を併用して具体的なBean名を指定できます。

@Component
public class FastEngine implements Engine { }

@Component
public class EcoEngine implements Engine { }

@Component
public class Car {
    @Autowired
    @Qualifier("fastEngine")
    private Engine engine;
}

@Resourceによる名前ベース注入

@Resource はJSR-250仕様に基づくアノテーションで、デフォルトではBean名(byName)でマッチングを行います。name属性で明示的にBean名を指定可能です。

public class StorageConfig {
    @Resource(name = "bucket")
    private String bucketName;

    @Resource(name = "style")
    private String styleName;
}

上記は次のXML定義と等価です:

<bean id="bucket" class="java.lang.String">
    <constructor-arg value="${oos.bucketName}"/>
</bean>
<bean id="style" class="java.lang.String">
    <constructor-arg value="${oos.styleName}"/>
</bean>

タグ: Spring Java Spring Boot Dependency Injection Annotations

5月28日 01:30 投稿