Spring - applicationContext getBeansWithAnnotation метод возвращает пустой список - PullRequest
0 голосов
/ 29 декабря 2018

Мой вопрос о методе 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"/>

Я могу получить список bean-компонентов, аннотированных MyCustomAnnotation при первом запуске моего приложения, используя метод getBeansWithAnnotation в MyCustomAnnotationListener.

Мой вопрос заключается в том, почему этот метод возвращает пустой список при его повторном запуске.

Спасибо

1 Ответ

0 голосов
/ 29 декабря 2018

ContextRefreshedEvent должно произойти один раз во время начальной загрузки контекста.Он опубликует событие в самом контексте и во всех его родительских контекстах.

Теперь его слушатель (т.е. MyCustomAnnotationListener) выполняется 2 раза, предполагая, что ваш контекст может иметь родительский контекст. Бины @MyCustomAnnotationопределяется в дочернем контексте, и поэтому родительский контекст не может его найти, и пустой список возвращается, когда для родительского контекста запускается MyCustomAnnotationListener.

Вы можете проверить, совпадает ли контекст с использованием applicationContext.getId().

Кстати: поскольку @MyCustomAnnotation также помечен @Component, он будет выбран Spring по умолчанию, нет необходимости устанавливать include-filter.

...