@TargetSE(valueSE={METHODSE,ANNOTATION_TYPESE}) @RetentionSE(valueSE=RUNTIMESE) @DocumentedSE 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
、@DependsOn
、@Primary
、@Lazy
アノテーションと組み合わせて使用する必要があります。例:
@Bean @Scope("prototype") public MyBean myBean() { // instantiate and configure MyBean obj return obj; }
@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 PropertyPlaceholderConfigurer ppc() { // instantiate, configure and return ppc ... }このメソッドを
static
としてマークすることにより、宣言する @Configuration
クラスをインスタンス化せずに呼び出すことができるため、上記のライフサイクルの競合を回避できます。ただし、static
@Bean
メソッドは、上記のようにスコープと AOP セマンティクスに対して拡張されないことに注意してください。これは、BFPP
の場合に機能します。これは、通常、他の @Bean
メソッドによって参照されないためです。注意として、BeanFactoryPostProcessor
に割り当て可能な戻り値の型を持つ非静的 @Bean
メソッドに対して、WARN レベルのログメッセージが発行されます。修飾子と型 | オプションの要素と説明 |
---|---|
Autowire | autowire 依存関係は、名前または型ごとの規則ベースのオートワイヤーを介して注入されますか? |
StringSE | destroyMethod JDBC DataSource 実装の close() メソッド、または Hibernate SessionFactory オブジェクトなど、アプリケーションコンテキストを閉じるときに Bean インスタンスで呼び出すメソッドのオプション名。 |
StringSE | initMethod 初期化中に Bean インスタンスで呼び出すメソッドのオプション名。 |
StringSE[] | name この Bean の名前、または複数の名前の場合、プライマリ Bean 名とエイリアス。 |
StringSE[] | value name() のエイリアス。 |
public abstract Autowire autowire
このオートワイヤーモードは、XML Bean の定義に類似した、慣例により Bean プロパティ setter メソッドに基づいた外部駆動のオートワイヤーにすぎないことに注意してください。
デフォルトモードでは、アノテーション駆動型のオートワイヤーが可能です。"no" は、外部駆動のオートワイヤーのみを指し、Bean クラス自体がアノテーションを通じて表現するオートワイヤー要求には影響しません。
public abstract StringSE initMethod
デフォルト値は ""
で、呼び出される init メソッドがないことを示します。
public abstract StringSE 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
および Closeable
SE/AutoCloseable
SE インターフェースは検出され、対応する destroy/close メソッドが呼び出されることに注意してください。
メモ: ライフサイクルがファクトリのフルコントロール下にある Bean でのみ呼び出されます。これは常にシングルトンの場合ですが、他のスコープでは保証されません。