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>