Spring Framework におけるコアアノテーションは、Java アプリケーションでの依存性注入 (DI) とコンポーネント管理を簡素化するために使用されます。これらのアノテーションは、Bean の定義、Bean 間の関係、および Bean のライフサイクルを宣言的に管理するのに役立ちます。
1. @Autowired
`@Autowired` アノテーションは、Spring コンテナが依存関係を自動的に解決し、注入するために使用されます。これは、型に基づいて機能し、フィールド、セッターメソッド、コンストラクタ、またはアノテートされたメソッドのパラメータに適用できます。
セッターメソッドに適用する場合:
@Component
public class Chinese implements Person {
private Axe axe;
@Autowired
public void setAxe(Axe axe) {
this.axe = axe;
}
}
複数のパラメータを持つメソッドに適用する場合:
Spring は、コンテナ内で型が一致する Bean を検索し、それらを引数としてメソッドを呼び出します。
@Component
public class Chinese implements Person {
private Axe axe;
private Dog dog;
@Autowired
public void setupDependencies(Axe axe, Dog dog) {
this.axe = axe;
this.dog = dog;
}
}
コンストラクタやインスタンス変数にも使用できます。
インスタンス変数に適用する場合:
@Component
public class Chinese implements Person {
@Autowired
private Axe axe;
@Autowired
public Chinese(Axe axe, Dog dog) {
this.axe = axe;
this.dog = dog;
}
}
配列型のフィールドに適用する場合:
Spring は、コンテナ内のすべての `Axe` インスタンスを検索し、それらを配列の要素として注入します。
@Component
public class Chinese implements Person {
@Autowired
private Axe[] axes;
}
コレクション型のフィールドやメソッドパラメータにも同様に適用できます。
@Component
public class Chinese implements Person {
private Set<Axe> axes;
@Autowired
public void setAxes(Set<Axe> axes) {
this.axes = axes;
}
}
コレクション型のパラメータにはジェネリクスを指定する必要があります。これにより、Spring はコンテナ内の `Axe` インスタンスを検索し、それらを `Set` として注入します。ジェネリクスが指定されていない場合、Spring はどの Bean を注入すべきか判断できません。
2. @Component
`@Component` は、汎用的な Spring Bean を示すために使用されるアノテーションです。
3. @Controller
`@Controller` は、Web アプリケーションにおけるコントローラーコンポーネントを示すために使用されます。
4. @Service
`@Service` は、ビジネスロジックコンポーネントを示すために使用されます。
5. @Repository
`@Repository` は、データアクセスオブジェクト (DAO) コンポーネントを示すために使用されます。
6. @Scope
`@Scope` アノテーションは、Bean インスタンスのスコープを指定するために使用されます。デフォルトは `singleton` です。
@Component
@Scope("prototype") // または "singleton", "request", "session" など
public class MyBean {
// ...
}
7. @Resource
`@Resource` アノテーションは、特定の Bean を名前で注入するために使用されます。これは Java 標準のアノテーションであり、Spring の `@Autowired` と似ていますが、型だけでなく名前でも注入できます。
@Component
public class Chinese implements Person {
private Axe axe;
@Resource(name = "stoneAxe")
public void setAxe(Axe axe) {
this.axe = axe;
}
}
8. @PostConstruct および @PreDestroy
これらのアノテーションは、Bean のライフサイクルイベントをカスタマイズするために使用されます。
- `@PostConstruct`: Bean の初期化後に実行されるメソッドを指定します。
- `@PreDestroy`: Bean の破棄前に実行されるメソッドを指定します。
@Component
public class MyService {
@PostConstruct
public void initialize() {
System.out.println("Bean is initializing...");
}
@PreDestroy
public void destroy() {
System.out.println("Bean is being destroyed...");
}
}
9. @DependsOn
`@DependsOn` アノテーションは、Bean の初期化順序を制御するために使用されます。指定された Bean が初期化された後に、この Bean が初期化されることを保証します。
@DependsOn({"steelAxe", "axeFactory"})
@Component
public class Chinese implements Person {
// ...
}
10. @Lazy
`@Lazy` アノテーションは、Bean の遅延初期化を制御するために使用されます。`true` に設定すると、その Bean は実際に必要とされるまで初期化されません。
@Lazy(true)
@Component
public class LazyBean {
// ...
}
11. @Qualifier
`@Qualifier` アノテーションは、`@Autowired` と共に使用され、型が一致する複数の Bean がコンテナに存在する場合に、特定の Bean を名前で選択して注入するために使用されます。
@Component
public class Chinese implements Person {
private Axe axe;
@Autowired
@Qualifier("steelAxe")
public void setAxe(Axe axe) {
this.axe = axe;
}
public void useAxe() {
System.out.println(axe.chop());
}
}
この例では、`@Autowired` によって `Axe` 型の Bean が注入されますが、`@Qualifier("steelAxe")` を使用することで、`steelAxe` という名前の `Axe` Bean が明示的に選択されます。`@Resource` アノテーションを使用すると、型と名前の両方で注入を制御できるため、多くの場合、`@Autowired` と `@Qualifier` を組み合わせるよりも簡潔です。