@Target(value={METHOD,ANNOTATION_TYPE})
@Retention(value=RUNTIME)
@Documented
public @interface Bean
このアノテーションの属性の名前とセマンティクスは、意図的に Spring XML スキーマの <bean/>
要素の名前とセマンティクスに似ています。例:
@Bean public MyBean myBean() { // instantiate and configure MyBean obj return obj; }
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; }
@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
宣言によって決定される直交関連であるシングルトン起動順序には影響しないことに注意してください。また、Priority
EE はメソッドで宣言できないため、このレベルでは使用できません。そのセマンティクスは、型ごとに 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 メソッドは、@Component
クラスで、または単純な古いクラスでさえ宣言できます。そのような場合、@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 BeanFactoryPostProcessor
(BFPP
)型を返す @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
メソッドに対して、WARN レベルのログメッセージが発行されます。修飾子と型 | オプションの要素と説明 |
---|---|
Autowire | autowire 使用すべきではありません。 5.1 現在、 @Bean ファクトリメソッドの引数解決と @Autowired 処理が名前 / 型ベースの Bean プロパティインジェクションに優先するため |
boolean | autowireCandidate この Bean は、他の Bean に自動接続される候補ですか? |
java.lang.String | destroyMethod JDBC DataSource 実装の close() メソッド、または Hibernate SessionFactory オブジェクトなど、アプリケーションコンテキストを閉じるときに Bean インスタンスで呼び出すメソッドのオプション名。 |
java.lang.String | initMethod 初期化中に Bean インスタンスで呼び出すメソッドのオプション名。 |
java.lang.String[] | name この Bean の名前、または複数の名前の場合、プライマリ Bean 名とエイリアス。 |
java.lang.String[] | value name() のエイリアス。 |
@Deprecated public abstract Autowire autowire
@Bean
ファクトリメソッドの引数解決と @Autowired
処理が名前 / 型ベースの Bean プロパティインジェクションに優先するため このオートワイヤーモードは、XML Bean の定義に類似した、慣例により Bean プロパティ setter メソッドに基づいた外部駆動のオートワイヤーにすぎないことに注意してください。
デフォルトモードでは、アノテーション駆動型のオートワイヤーが可能です。"no" は、外部駆動のオートワイヤーのみを指し、Bean クラス自体がアノテーションを通じて表現するオートワイヤー要求には影響しません。
public abstract boolean autowireCandidate
デフォルトは true
です。他の場所で同じ型の Bean を邪魔することを意図していない内部デリゲートの場合、これを false
に設定します。
public abstract java.lang.String initMethod
デフォルト値は ""
で、呼び出される init メソッドがないことを示します。
public abstract java.lang.String destroyMethod
DataSource
実装の close()
メソッド、または Hibernate SessionFactory
オブジェクトなど、アプリケーションコンテキストを閉じるときに Bean インスタンスで呼び出すメソッドのオプション名。メソッドには引数が必要ありませんが、例外がスローされる場合があります。 ユーザーの利便性のため、コンテナーは @Bean
メソッドから返されたオブジェクトに対して destroy メソッドを推論しようとします。例: @Bean
メソッドが Apache Commons DBCP BasicDataSource
を返す場合、コンテナーはそのオブジェクトで使用可能な close()
メソッドを認識し、それを destroyMethod
として自動的に登録します。この「destroy メソッドの推論」は現在、"close" または "shutdown" という名前の引数なしのパブリックメソッドのみの検出に制限されています。メソッドは継承階層のどのレベルでも宣言でき、@Bean
メソッドの戻り値の型に関係なく検出されます (つまり、作成時に Bean インスタンス自体に対して反射的に検出されます)。
特定の @Bean
の destroy メソッド推論を無効にするには、値として空の文字列を指定します。@Bean(destroyMethod="")
。それでも、DisposableBean
コールバックインターフェースが検出され、対応する destroy メソッドが呼び出されることに注意してください。つまり、destroyMethod=""
はカスタムのクローズ / シャットダウンメソッドにのみ影響し、Closeable
/AutoCloseable
はクローズメソッドを宣言します。
メモ: ライフサイクルがファクトリのフルコントロール下にある Bean でのみ呼び出されます。これは常にシングルトンの場合ですが、他のスコープでは保証されません。