Spring - applicationContext getBeansWithAnnotation 方法 returns 一个空列表
Spring - applicationContext getBeansWithAnnotation method returns an empty list
我的问题是关于 getBeansWithAnnotation 方法。
我有一个名为 MyCustomAnnotation 的自定义注释。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
@Scope("prototype")
public @interface MyCustomAnnotation {
String group() default "DEFAULT_GROUP";
}
我也有一个监听器 class 如下所示:
public class MyCustomAnnotationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
Map<String, Object> myCustomAnnotationBeans = applicationContext.getBeansWithAnnotation(MyCustomAnnotation.class);
}
}
我已配置我的应用程序-context.xml 以使用 MyCustomAnnotation 扫描组件。
<context:include-filter type="annotation" expression="com.annotations.MyCustomAnnotation"/>
我可以在我的应用程序初始启动期间使用 MyCustomAnnotationListener 中的 getBeansWithAnnotation 方法获取用 MyCustomAnnotation 注释的 bean 列表。
我的问题是为什么这个方法returns第二次触发时是一个空列表。
谢谢
ContextRefreshedEvent
应该在引导上下文期间发生一次。它会将事件发布到上下文本身及其所有父上下文。
现在它的侦听器(即 MyCustomAnnotationListener
)执行了 2 次,表明您的上下文可能有一个父上下文。@MyCustomAnnotation
beans 是在子上下文中定义的,因此父上下文找不到它当 MyCustomAnnotationListener
为父上下文运行时,空列表为 return。
您可以使用 applicationContext.getId()
.
验证上下文是否相同
顺便说一句:由于@MyCustomAnnotation
也标有@Component
,默认情况下会被Spring拾取,不需要设置include-filter
。
我的问题是关于 getBeansWithAnnotation 方法。
我有一个名为 MyCustomAnnotation 的自定义注释。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
@Scope("prototype")
public @interface MyCustomAnnotation {
String group() default "DEFAULT_GROUP";
}
我也有一个监听器 class 如下所示:
public class MyCustomAnnotationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
Map<String, Object> myCustomAnnotationBeans = applicationContext.getBeansWithAnnotation(MyCustomAnnotation.class);
}
}
我已配置我的应用程序-context.xml 以使用 MyCustomAnnotation 扫描组件。
<context:include-filter type="annotation" expression="com.annotations.MyCustomAnnotation"/>
我可以在我的应用程序初始启动期间使用 MyCustomAnnotationListener 中的 getBeansWithAnnotation 方法获取用 MyCustomAnnotation 注释的 bean 列表。
我的问题是为什么这个方法returns第二次触发时是一个空列表。
谢谢
ContextRefreshedEvent
应该在引导上下文期间发生一次。它会将事件发布到上下文本身及其所有父上下文。
现在它的侦听器(即 MyCustomAnnotationListener
)执行了 2 次,表明您的上下文可能有一个父上下文。@MyCustomAnnotation
beans 是在子上下文中定义的,因此父上下文找不到它当 MyCustomAnnotationListener
为父上下文运行时,空列表为 return。
您可以使用 applicationContext.getId()
.
顺便说一句:由于@MyCustomAnnotation
也标有@Component
,默认情况下会被Spring拾取,不需要设置include-filter
。