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で利用可能]にあります。