アノテーションインターフェース Bean


メソッドが Spring コンテナーによって管理される Bean を生成することを示します。

概要

このアノテーションの属性の名前とセマンティクスは、意図的に Spring XML スキーマの <bean/> 要素の名前とセマンティクスに似ています。例:

     @Bean
     public MyBean myBean() {
         // instantiate and configure MyBean obj
         return obj;
     }
 

Bean 名

name() 属性が使用可能ですが、Bean の名前を決定するためのデフォルトの戦略は、@Bean メソッドの名前を使用することです。これは便利で直感的ですが、明示的な命名が必要な場合は、name 属性(またはそのエイリアス value)を使用できます。name は文字列の配列を受け入れ、単一の Bean に対して複数の名前(つまり、プライマリ Bean 名と 1 つ以上のエイリアス)を許可することにも注意してください。

     @Bean({"b1", "b2"}) // bean available as 'b1' and 'b2', but not 'myBean'
     public MyBean myBean() {
         // instantiate and configure MyBean obj
         return obj;
     }
 

Profile, Scope, Lazy, DependsOn, Primary, Order

@Bean アノテーションは、プロファイル、スコープ、レイジー、依存、プライマリの属性を提供しないことに注意してください。むしろ、@Scope@Lazy@DependsOn@Primary アノテーションと組み合わせて使用して、これらのセマンティクスを宣言する必要があります。例:

     @Bean
     @Profile("production")
     @Scope("prototype")
     public MyBean myBean() {
         // instantiate and configure MyBean obj
         return obj;
     }
 
上記のアノテーションのセマンティクスは、コンポーネントクラスレベルでの使用に一致します。@Profile は、特定の Bean を選択的に含めることを許可します。@Scope は、Bean のスコープをシングルトンから指定されたスコープに変更します。@Lazy は、デフォルトのシングルトンスコープの場合にのみ実際の効果があります。@DependsOn は、Bean が直接参照を通じて表した依存関係に加えて、この Bean が作成される前に特定の他の Bean の作成を強制します。これは通常、シングルトンの起動に役立ちます。@Primary は、単一のターゲットコンポーネントを注入する必要があるが、型によって複数の Bean が一致する場合に、インジェクションポイントレベルであいまいさを解決するメカニズムです。

さらに、@Bean メソッドは、対応するコンポーネントクラスの対応するアノテーションと同様にインジェクションポイントの解決時に考慮される修飾子アノテーションと @Order 値も宣言できますが、Bean 定義ごとに非常に個別になる可能性があります(同じ Bean クラスの複数の定義の場合))。修飾子は、最初の型の一致後に候補のセットを絞り込みます。順序値は、コレクションインジェクションポイントの場合に解決される要素の順序を決定します(複数のターゲット Bean が型と修飾子で一致する)。

注意 @Order 値は、インジェクションポイントでの優先順位に影響を与える可能性がありますが、前述の依存関連と @DependsOn 宣言によって決定される直交関連であるシングルトン起動順序には影響しないことに注意してください。また、PriorityEE はメソッドで宣言できないため、このレベルでは使用できません。そのセマンティクスは、型ごとに 1 つの Bean で @Order 値と @Primary を組み合わせてモデル化できます。

 @Configuration クラスの @Bean メソッド

通常、@Bean メソッドは @Configuration クラス内で宣言されます。この場合、Bean メソッドは、 直接呼び出すことにより、同じクラス内の他の @Bean メソッドを参照できます。これにより、Bean 間の参照が厳密に型指定され、ナビゲート可能になります。このようないわゆる「Bean 間の参照」は、getBean() ルックアップと同様に、スコープと AOP セマンティクスを考慮することが保証されています。これらは、元の "Spring JavaConfig" プロジェクトで知られているセマンティクスであり、実行時にそのような各構成クラスの CGLIB サブクラス化を必要とします。そのため、このモードでは、@Configuration クラスとそのファクトリメソッドを final または private としてマークしないでください。例:

 @Configuration
 public class AppConfig {

     @Bean
     public FooService fooService() {
         return new FooService(fooRepository());
     }

     @Bean
     public FooRepository fooRepository() {
         return new JdbcFooRepository(dataSource());
     }

     // ...
 }

@Bean Lite モード

@Bean メソッドは、@Configuration アノテーションが付けられていないクラス内で宣言することもできます。Bean メソッドが @Configuration アノテーションが付けられていない Bean 上で宣言されている場合、そのメソッドはいわゆる「ライト」モードで処理されます。

ライトモードの Bean メソッドは、スコーピングおよびライフサイクルコールバックが適切に適用された状態で、コンテナー(XML の factory-method 宣言と同様)によってプレーンファクトリメソッドとして扱われます。この場合、包含クラスは変更されないままであり、包含クラスまたはファクトリメソッドに対する異常な制約はありません。

@Configuration クラスの Bean メソッドのセマンティクスとは異なり、ライトモードでは「Bean 間参照」はサポートされていません。代わりに、1 つの @Bean メソッドがライトモードで別の @Bean メソッドを呼び出す場合、呼び出しは標準の Java メソッド呼び出しです。Spring は、CGLIB プロキシを介した呼び出しをインターセプトしません。これは、@Transactional メソッド間呼び出しと類似しており、プロキシモードでは、Spring は呼び出しをインターセプトしません。Spring は、AspectJ モードでのみインターセプトします。

例:

 @Component
 public class Calculator {
     public int sum(int a, int b) {
         return a+b;
     }

     @Bean
     public MyBean myBean() {
         return new MyBean();
     }
 }

ブートストラップ

AnnotationConfigApplicationContext およびフレンドを使用してコンテナーをブートストラップする方法を含む詳細については、@Configuration javadoc を参照してください。

 @Bean メソッドを返す BeanFactoryPostProcessor 

Spring BeanFactoryPostProcessorBFPP)型を返す @Bean メソッドについては、特別な考慮が必要です。BFPP オブジェクトは、コンテナーのライフサイクルの非常に早い段階でインスタンス化する必要があるため、@Configuration クラス内の @Autowired@Value@PostConstruct などのアノテーションの処理を妨げる可能性があります。これらのライフサイクルの課題を回避するには、@Bean メソッドを返す BFPP を static としてマークします。例:

     @Bean
     public static PropertySourcesPlaceholderConfigurer pspc() {
         // instantiate, configure and return pspc ...
     }
 
このメソッドを static としてマークすることにより、宣言する @Configuration クラスをインスタンス化せずに呼び出すことができるため、上記のライフサイクルの競合を回避できます。ただし、static@Bean メソッドは、上記のようにスコープと AOP セマンティクスに対して拡張されないことに注意してください。これは、BFPP の場合に機能します。これは、通常、他の @Bean メソッドによって参照されないためです。念のため、BeanFactoryPostProcessor に割り当て可能な戻り値の型を持つ非静的 @Bean メソッドに対して INFO レベルのログメッセージが発行されます。
導入:
3.0
作成者:
Rod Johnson, Costin Leau, Chris Beams, Juergen Hoeller, Sam Brannen
関連事項:
  • ネストされたクラスのサマリー

    ネストされたクラス
    修飾子と型
    クラス
    説明
    static enum
    ブートストラップモードのローカル列挙。
  • オプション要素のサマリー

    オプション要素
    修飾子と型
    オプションの要素
    説明
    boolean
    この Bean は、他の Bean にオートワイヤーできる候補でしょうか ?
    この Bean: デフォルトのブートストラップモードは、非遅延シングルトン Bean の場合はメインの事前インスタンス化スレッド、プロトタイプ Bean の場合は呼び出し元スレッドです。
    boolean
    この Bean は、修飾子の一致などの追加の指示なしに、プレーン型に基づいて他の Bean にオートワイヤーされる候補ですか ?
    JDBC DataSource 実装の close() メソッド、または Hibernate SessionFactory オブジェクトなど、アプリケーションコンテキストを閉じるときに Bean インスタンスで呼び出すメソッドのオプション名。
    初期化中に Bean インスタンスで呼び出すメソッドのオプション名。
    この Bean の名前、または複数の名前の場合、プライマリ Bean 名とエイリアス。
    name() のエイリアス。
  • 要素の詳細

    • value

      @AliasFor("name") StringSE[] value
      name() のエイリアス。

      他の属性が不要な場合に使用することを目的としています。例: @Bean("customBeanName")

      導入:
      4.3.3
      関連事項:
      デフォルト:
      {}
    • name

      @AliasFor("value") StringSE[] name
      この Bean の名前、または複数の名前の場合、プライマリ Bean 名とエイリアス。

      指定しない場合、Bean の名前はアノテーション付きメソッドの名前です。指定した場合、メソッド名は無視されます。

      Bean の名前とエイリアスは、他の属性が宣言されていない場合、value() 属性を介して構成することもできます。

      関連事項:
      デフォルト:
      {}
    • autowireCandidate

      boolean autowireCandidate
      この Bean は、他の Bean にオートワイヤーできる候補でしょうか ?

      デフォルトは true です。他の場所で同じ型の Bean を邪魔することを意図していない内部デリゲートの場合、これを false に設定します。

      導入:
      5.1
      関連事項:
      デフォルト:
      true
    • defaultCandidate

      boolean defaultCandidate
      この Bean は、修飾子の一致などの追加の指示なしに、プレーン型に基づいて他の Bean にオートワイヤーされる候補ですか ?

      デフォルトは true です。特定の領域に挿入可能であるが、他の場所にある同じ型の Bean の邪魔にならないようにする制限付きデリゲートの場合は、これを false に設定します。

      これは、autowireCandidate() のバリエーションであり、一般的にインジェクションを無効にするのではなく、修飾子などの追加の指示を強制するだけです。

      導入:
      6.2
      関連事項:
      デフォルト:
      true
    • bootstrap

      Bean.Bootstrap bootstrap
      この Bean: デフォルトのブートストラップモードは、非遅延シングルトン Bean の場合はメインの事前インスタンス化スレッド、プロトタイプ Bean の場合は呼び出し元スレッドです。

      Bean.Bootstrap.BACKGROUND を設定すると、この Bean をバックグラウンドスレッドでインスタンス化できるようになります。非遅延シングルトンの場合、バックグラウンドの事前インスタンス化スレッドを使用でき、ConfigurableApplicationContext.refresh() の終了時に完了を強制することができます。遅延シングルトンの場合、バックグラウンドの事前インスタンス化スレッドも使用できます。補完は後で許可され、実際にアクセスされたときに強制されます。

      導入:
      6.2
      関連事項:
      デフォルト:
      DEFAULT
    • initMethod

      StringSE initMethod
      初期化中に Bean インスタンスで呼び出すメソッドのオプションの名前。メソッドは、Bean アノテーション付きメソッドの本体内でプログラムによって直接呼び出される可能性があるため、一般的には使用されません。

      デフォルト値は "" で、呼び出される init メソッドがないことを示します。

      関連事項:
      デフォルト:
      ""
    • destroyMethod

      StringSE destroyMethod
      JDBC DataSource 実装の close() メソッド、または Hibernate SessionFactory オブジェクトなど、アプリケーションコンテキストを閉じるときに Bean インスタンスで呼び出すメソッドのオプション名。メソッドには引数が必要ありませんが、例外がスローされる場合があります。

      ユーザーの利便性のため、コンテナーは @Bean メソッドから返されたオブジェクトに対して destroy メソッドを推論しようとします。例: @Bean メソッドが Apache Commons DBCP BasicDataSource を返す場合、コンテナーはそのオブジェクトで使用可能な close() メソッドを認識し、それを destroyMethod として自動的に登録します。この「destroy メソッドの推論」は現在、"close" または "shutdown" という名前の引数なしのパブリックメソッドのみの検出に制限されています。メソッドは継承階層のどのレベルでも宣言でき、@Bean メソッドの戻り値の型に関係なく検出されます (つまり、作成時に Bean インスタンス自体に対して反射的に検出されます)。

      特定の @Bean の破棄メソッドの推論を無効にするには、値として空の文字列を指定します (例: @Bean(destroyMethod=""))。ただし、DisposableBean コールバックインターフェースは検出され、対応する破棄メソッドが呼び出されることに注意してください。つまり、destroyMethod="" はカスタムの close/shutdown メソッドと CloseableSE/AutoCloseableSE で宣言された close メソッドにのみ影響します。

      メモ: ライフサイクルがファクトリのフルコントロール下にある Bean でのみ呼び出されます。これは常にシングルトンの場合ですが、他のスコープでは保証されません。

      関連事項:
      デフォルト:
      「(推定)」