我的问题是关于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);
}
}
我已经配置了application-context.xml以使用MyCustomAnnotation扫描组件。
<context:include-filter type="annotation" expression="com.annotations.MyCustomAnnotation"/>
我可以使用MyCustomAnnotationListener中的getBeansWithAnnotation方法在应用程序的初始启动过程中获取使用MyCustomAnnotation注释的bean列表。
我的问题是,为什么该方法在第二次触发时返回一个空列表。
谢谢
最佳答案
ContextRefreshedEvent
应该在引导上下文期间发生一次。它将事件发布到上下文本身及其所有父上下文。
现在其侦听器(即MyCustomAnnotationListener
)执行两次,表明您的上下文可能具有父上下文。@MyCustomAnnotation
bean是在子上下文中定义的,因此父上下文找不到它,并且当MyCustomAnnotationListener
时返回空列表为父上下文运行。
您可以使用applicationContext.getId()
验证上下文是否相同。
顺便说一句:由于@MyCustomAnnotation
也用@Component
标记,因此默认情况下它将由Spring拾取,无需设置include-filter
。