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

"