私の質問はgetBeansWithAnnotationメソッドについてです。
MyCustomAnnotationという名前のカスタムアノテーションがあります。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
@Scope("prototype")
public @interface MyCustomAnnotation {
String group() default "DEFAULT_GROUP";
}
以下のようなリスナークラスもあります。
public class MyCustomAnnotationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
Map<String, Object> myCustomAnnotationBeans = applicationContext.getBeansWithAnnotation(MyCustomAnnotation.class);
}
}
MyCustomAnnotationを使用してコンポーネントをスキャンするようにapplication-context.xmlを構成しました。
<context:include-filter type="annotation" expression="com.annotations.MyCustomAnnotation"/>
MyCustomAnnotationListenerのgetBeansWithAnnotationメソッドを使用して、アプリケーションの初期起動時にMyCustomAnnotationでアノテーションが付けられたBeanのリストを取得できます。
私の質問は、このメソッドが2回目にトリガーされたときに、なぜ空のリストを返すのかということです。
ありがとう
ContextRefreshedEvent
コンテキストのブートストラップ中に1回発生する必要があります。イベントをコンテキスト自体とそのすべての親コンテキストに公開します。
これで、リスナー(ie MyCustomAnnotationListener
)が2回実行され、コンテキストに親コンテキストがある可能性があることが示唆されます。Bean@MyCustomAnnotation
は子コンテキストで定義されているため、親コンテキストはそれを見つけることができずMyCustomAnnotationListener
、親コンテキストに対して実行すると空のリストが返されます。
を使用して、コンテキストが同じかどうかを確認できますapplicationContext.getId()
。
ところで:@MyCustomAnnotation
もマークされて@Component
いるように、デフォルトでSpringによって取得されますinclude-filter
。を設定する必要はありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加