アノテーションインターフェース 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
宣言によって決定される直交関連であるシングルトン起動順序には影響しないことに注意してください。また、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 メソッドが @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 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
メソッドに対して INFO レベルのログメッセージが発行されます。オプション要素のサマリー
要素の詳細
value
name()
のエイリアス。他の属性が不要な場合に使用することを目的としています。例:
@Bean("customBeanName")
- 導入:
- 4.3.3
- 関連事項:
- デフォルト:
- {}
name
この Bean の名前、または複数の名前の場合、プライマリ Bean 名とエイリアス。指定しない場合、Bean の名前はアノテーション付きメソッドの名前です。指定した場合、メソッド名は無視されます。
Bean の名前とエイリアスは、他の属性が宣言されていない場合、
value()
属性を介して構成することもできます。- 関連事項:
- デフォルト:
- {}
autowireCandidate
boolean autowireCandidateこの Bean は、他の Bean に自動接続される候補ですか?デフォルトは
true
です。他の場所で同じ型の Bean を邪魔することを意図していない内部デリゲートの場合、これをfalse
に設定します。- 導入:
- 5.1
- デフォルト:
- true
initMethod
StringSE initMethod初期化中に Bean インスタンスで呼び出すメソッドのオプションの名前。メソッドは、Bean アノテーション付きメソッドの本体内でプログラムによって直接呼び出される可能性があるため、一般的には使用されません。デフォルト値は
""
で、呼び出される init メソッドがないことを示します。- デフォルト:
- ""
destroyMethod
StringSE destroyMethodJDBCDataSource
実装のclose()
メソッド、または HibernateSessionFactory
オブジェクトなど、アプリケーションコンテキストを閉じるときに Bean インスタンスで呼び出すメソッドのオプション名。メソッドには引数が必要ありませんが、例外がスローされる場合があります。ユーザーの利便性のため、コンテナーは
@Bean
メソッドから返されたオブジェクトに対して destroy メソッドを推論しようとします。例:@Bean
メソッドが Apache Commons DBCPBasicDataSource
を返す場合、コンテナーはそのオブジェクトで使用可能なclose()
メソッドを認識し、それをdestroyMethod
として自動的に登録します。この「destroy メソッドの推論」は現在、"close" または "shutdown" という名前の引数なしのパブリックメソッドのみの検出に制限されています。メソッドは継承階層のどのレベルでも宣言でき、@Bean
メソッドの戻り値の型に関係なく検出されます (つまり、作成時に Bean インスタンス自体に対して反射的に検出されます)。特定の
@Bean
の destroy メソッドの推測を無効にするには、値として空の文字列を指定します。@Bean(destroyMethod="")
それでもDisposableBean
コールバックインターフェースは検出され、対応する destroy メソッドが呼び出されることに注意してください。つまり、destroyMethod=""
はカスタムのクローズ / シャットダウンメソッドとCloseable
SE/AutoCloseable
SE 宣言されたクローズメソッドにのみ影響します。メモ: ライフサイクルがファクトリのフルコントロール下にある Bean でのみ呼び出されます。これは常にシングルトンの場合ですが、他のスコープでは保証されません。
- デフォルト:
- 「(推定)」