Springコアアノテーション
1.概要
__org.springframework.beans.factory.annotation
および
org.springframework.context.annotation__パッケージのアノテーションを使用して、Spring DIエンジンの機能を活用できます。
私たちはしばしばこれらを「Springコアアノテーション」と呼び、このチュートリアルでそれらをレビューします。
2. DI関連の注釈
2.1.
@ Autowired
私たちは
@ Autowired
を使って、Springが解決しようとしている依存性を示すことができます。このアノテーションはコンストラクタ、セッター、またはフィールドインジェクションと共に使用できます。
コンストラクタインジェクション:
class Car {
Engine engine;
@Autowired
Car(Engine engine) {
this.engine = engine;
}
}
セッター注入:
class Car {
Engine engine;
@Autowired
void setEngine(Engine engine) {
this.engine = engine;
}
}
フィールドインジェクション:
class Car {
@Autowired
Engine engine;
}
@ Autowired
には
required
という
boolean
引数があり、デフォルト値は
true
です。ワイヤリングに適したBeanが見つからない場合は、Springの動作を調整します。
true
の場合、例外がスローされます。それ以外の場合、ワイヤリングされたものは何もありません。
コンストラクタインジェクションを使用する場合、すべてのコンストラクタ引数は必須です。
バージョン4.3以降では、少なくとも2つのコンストラクタを宣言しない限り、コンストラクタに
@ Autowired
で明示的に注釈を付ける必要はありません。
詳細については、
@ Autowired
および
コンストラクター注入
に関する記事を参照してください。
2.2.
@豆
@ Bean
は、Spring Beanをインスタンス化するファクトリメソッドを示します。
@Bean
Engine engine() {
return new Engine();
}
-
Springは、戻り型の新しいインスタンスが必要なときに** これらのメソッドを呼び出します。
結果のBeanはファクトリメソッドと同じ名前になります。別の名前を付けたい場合は、このアノテーションの
name
または
value
引数を使用して指定できます(引数
value
は引数
name
のエイリアスです)。
@Bean("engine")
Engine getEngine() {
return new Engine();
}
@ Bean
でアノテーションが付けられたすべてのメソッドは
@ Configuration
クラスになければならないことに注意してください。
2.3.
@修飾子
あいまいな状況で使用したいBean IDまたはBean名を提供するために、
@ Autowired
とともに
@ Qualifier
を使用します。
たとえば、次の2つのBeanは同じインタフェースを実装しています。
class Bike implements Vehicle {}
class Car implements Vehicle {}
Springが
Behicle
Beanをインジェクトする必要がある場合、それは複数の一致する定義になります。そのような場合、
@ Qualifier
アノテーションを使用してBeanの名前を明示的に提供できます。
コンストラクタインジェクションを使う:
@Autowired
Biker(@Qualifier("bike") Vehicle vehicle) {
this.vehicle = vehicle;
}
セッター注入を使用する:
@Autowired
void setVehicle(@Qualifier("bike") Vehicle vehicle) {
this.vehicle = vehicle;
}
あるいは
@Autowired
@Qualifier("bike")
void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
フィールドインジェクションを使う:
@Autowired
@Qualifier("bike")
Vehicle vehicle;
より詳細な説明については、
この記事
を読んでください。
2.4.
@必須
XMLを介して生成したい依存関係をマークするための設定メソッドの
@必須
@Required
void setColor(String color) {
this.color = color;
}
<bean class="com.baeldung.annotations.Bike">
<property name="color" value="green"/>
</bean>
そうでない場合は、
BeanInitializationException
がスローされます。
2.5.
@値
プロパティ値をBeanにインジェクトするために
@Value
を使用できます。コンストラクタ、セッター、フィールドインジェクションと互換性があります。
コンストラクタインジェクション:
Engine(@Value("8") int cylinderCount) {
this.cylinderCount = cylinderCount;
}
セッター注入:
@Autowired
void setCylinderCount(@Value("8") int cylinderCount) {
this.cylinderCount = cylinderCount;
}
あるいは
@Value("8")
void setCylinderCount(int cylinderCount) {
this.cylinderCount = cylinderCount;
}
フィールドインジェクション:
@Value("8")
int cylinderCount;
もちろん、静的な値を注入することは役に立ちません。そのため、
@ Value
に
プレースホルダー文字列
を使用して、外部ソース** で定義されている値、たとえば
.properties
ファイルまたは
.yaml
ファイルに関連付けることができます。
次の
.properties
ファイルを仮定しましょう。
engine.fuelType=petrol
以下のように
engine.fuelType
の値を注入できます。
@Value("${engine.fuelType}")
String fuelType;
SpELでも
@ Value
を使うことができます。より高度な例は、リンク:/spring-value-annotation[
@ Value
に関する記事]にあります。
2.6.
@ DependsOn
この注釈を使用して、注釈付きのBeanの前にSpringに他のBeanを初期化させることができます。通常、この動作はBean間の明示的な依存関係に基づいて自動的に行われます。
このアノテーションは、依存関係が暗黙的である場合にのみ必要です。たとえば、JDBCドライバのロードや静的変数の初期化などです。
依存関係Beanの名前を指定する依存クラスに
@ DependsOn
を使用できます。アノテーションの
value
引数には、依存性Beanの名前を含む配列が必要です。
@DependsOn("engine")
class Car implements Vehicle {}
あるいは、
@ Bean
アノテーションでBeanを定義すると、ファクトリメソッドは
@ DependsOn
のアノテーションを付ける必要があります。
@Bean
@DependsOn("fuel")
Engine engine() {
return new Engine();
}
2.7.
@ Lazy
Beanを遅延初期化する場合は、
@ Lazy
を使用します。デフォルトでは、SpringはすべてのシングルトンBeanをアプリケーションコンテキストの起動時またはブートストラップ時に熱心に作成します。
ただし、アプリケーションの起動時ではなく、要求時にBeanを作成する必要がある場合があります。
この注釈は、正確に配置する場所によって動作が異なります。それを置くことができます:
-
@ Bean
アノテーション付きBeanファクトリメソッド、メソッド呼び出しを遅らせる
(それ故にBeanの作成)
** @
Configuration
クラスとそれに含まれるすべての
@ Bean
メソッドは
影響を受ける
**
@ Component
クラス、これは
@ Configuration
クラスではない、このBean
遅延初期化されます
** 依存関係をロードするための
@ Autowired
コンストラクタ、セッター、またはフィールド
自分自身を遅延的に(プロキシ経由で)
このアノテーションは
value
という名前の引数を持ち、デフォルト値は
true
です。デフォルトの動作を上書きすると便利です。
たとえば、グローバル設定が遅延しているときにBeanが積極的にロードされるようにマークするか、
@ Lazy
でマークされた
@ Configuration
クラスで積極的にロードするように特定の
@ Bean
メソッドを設定します。
@Configuration
@Lazy
class VehicleFactoryConfig {
@Bean
@Lazy(false)
Engine engine() {
return new Engine();
}
}
詳細については、
この記事
を参照してください。
2.8.
@見上げる
@ Lookup
のアノテーションが付けられたメソッドは、Springがそれを呼び出したときにそのメソッドの戻り型のインスタンスを返すように指示します。
注釈リンクについての詳細な情報:/spring-lookup[この記事で見つけることができます]。
2.9.
@プライマリ
同じタイプの複数のBeanを定義しなければならない場合があります。これらのケースでは、SpringがどのBeanを必要としているのかがわからないため、インジェクションは失敗します。
このシナリオに対処するためのオプションをすでに見ました。すべての配線ポイントを
@ Qualifier
でマークし、必要なBeanの名前を指定します。
ただし、ほとんどの場合、特定のBeanが必要ですが、他のBeanはほとんど必要ありません。
このケースを単純にするために
@ Primary
を使用できます。
@Component
@Primary
class Car implements Vehicle {}
@Component
class Bike implements Vehicle {}
@Component
class Driver {
@Autowired
Vehicle vehicle;
}
@Component
class Biker {
@Autowired
@Qualifier("bike")
Vehicle vehicle;
}
前の例では、
Car
が主要車両です。したがって、
Driver
クラスでは、Springは
Car
Beanを挿入します。もちろん、
Biker
Beanでは、フィールド
vehicle
の値は修飾されているので
Bike
オブジェクトになります。
2.10.
@範囲
@ Scope
を使用してリンクを定義します。/spring-bean-scopes
@ Component
クラス、または
@ Bean
定義。
例えば:
@Component
@Scope("prototype")
class Engine {}
3.コンテキスト設定アノテーション
このセクションで説明されているアノテーションを使ってアプリケーションコンテキストを設定できます。
3.1.
@プロフィール
Springが特定のプロファイルがアクティブなときにだけ
@ Component
クラスまたは
@ Bean
メソッドを** 使用するようにしたい場合は、
@ Profile
でマークすることができます。アノテーションの
value
引数でプロファイルの名前を設定できます。
@Component
@Profile("sportDay")
class Bike implements Vehicle {}
プロファイルの詳細については、/spring-profiles[この記事]を参照してください。
3.2.
@インポート
このアノテーションを使って、コンポーネントスキャンなしで** 特定の
@ Configuration
クラスを使うことができます。これらのクラスに
@ Import
´s
value
引数を指定できます。
@Import(VehiclePartSupplier.class)
class VehicleFactoryConfig {}
3.3.
@ ImportResource
このアノテーションを使ってXML設定をインポートすることができます。 XMLファイルの場所は、
locations
引数、またはその別名、
value
引数で指定できます。
@Configuration
@ImportResource("classpath:/annotations.xml")
class VehicleFactoryConfig {}
3.4.
@ PropertySource
このアノテーションを使用して、アプリケーション設定用のプロパティファイルを定義できます。
@Configuration
@PropertySource("classpath:/annotations.properties")
class VehicleFactoryConfig {}
@ PropertySource
は、Java 8の繰り返しアノテーション機能を利用します。つまり、クラスに複数回マークを付けることができます。
@Configuration
@PropertySource("classpath:/annotations.properties")
@PropertySource("classpath:/vehicle-factory.properties")
class VehicleFactoryConfig {}
3.5.
@ PropertySources
このアノテーションを使用して、複数の
@ PropertySource
設定を指定できます。
@Configuration
@PropertySources({
@PropertySource("classpath:/annotations.properties"),
@PropertySource("classpath:/vehicle-factory.properties")
})
class VehicleFactoryConfig {}
Java 8以降、上記のように注釈の繰り返し機能を使用して同じことを実現できることに注意してください。
4.まとめ
この記事では、最も一般的なSpringコア注釈の概要を見ました。 Beanの配線とアプリケーションコンテキストの設定方法、およびコンポーネントスキャンのためにクラスにマークを付ける方法を見ました。
いつものように、例はhttps://github.com/eugenp/tutorials/tree/master/spring-boot-mvc[GitHubで利用可能]にあります。
次
”