Как объявить bean-компонент Spring autowire-candidate=false при использовании аннотаций?

Я использую @ComponentScan и @Component для определения своих весенних бобов. Я хотел бы объявить один из этих bean-компонентов autowire-candidate=false.

Это можно сделать с помощью этого атрибута в xml. Разве нет эквивалента в аннотациях?

Причина, по которой я хочу этого, заключается в том, что у меня есть две реализации одного и того же интерфейса, и я не хочу использовать @Qualifier.

РЕДАКТИРОВАТЬ: использование @Primary является допустимым обходным путем, но autowire-candidate кажется мне полезной функцией со своей собственной семантикой.

Спасибо


person Nazaret K.    schedule 21.01.2015    source источник
comment
Аннотируйте предпочтительный вариант с помощью @Primary. Нет необходимости использовать @Qualifier таким образом.   -  person M. Deinum    schedule 21.01.2015
comment
Спасибо за комментарий. Да, на самом деле это один из способов, который я нашел для решения проблемы, но мне просто интересно, почему в аннотациях нет эквивалента autowire-candidate.   -  person Nazaret K.    schedule 21.01.2015
comment
Похоже, Spring отказался от концепции autowire-candidate=false и больше не поддерживает ее. С аннотациями аналога нет, поэтому @Primary только так, как вы заметили.   -  person Sergey Bespalov    schedule 12.10.2016
comment
Сергей Беспалов, возможно, вам следует написать это как ответ, потому что казалось, что это единственная правда.   -  person Николай Митропольский    schedule 12.10.2016
comment
@НиколайМитропольский, сделано с некоторыми дополнительными предложениями.   -  person Sergey Bespalov    schedule 13.10.2016


Ответы (3)


Похоже, Spring отказался от концепции autowire-candidate=false и больше не поддерживает ее. С аннотациями аналога нет, так что @Primary лучший обходной путь, как вы заметили.

Другой способ — использовать пользовательский org.springframework.beans.factory.support.AutowireCandidateResolver, который используется в DefaultListableBeanFactory, с логикой, исключающей нежелательные bean-компоненты из кандидатов на автосвязывание. В этом случае технология будет аналогична той, что использовалась для autowire-candidate=false в SimpleAutowireCandidateResolver.

person Sergey Bespalov    schedule 13.10.2016

Начиная с Spring 5.1, вы можете настроить autowire-candidate в атрибуте @Bean через autowireCandidate:

@Bean(autowireCandidate = false)
public FooBean foo() {
      return newFooBean();
}
person Ken Chan    schedule 18.10.2019

Вы также можете использовать средство доступа bean для настройки его видимости.

см. Видимость компонента

@Configuration
public abstract class VisibilityConfiguration {

    @Bean
    public Bean publicBean() {
        Bean bean = new Bean();
        bean.setDependency(hiddenBean());
        return bean;
    }

    @Bean
    protected Bean hiddenBean() {
        return new Bean("protected bean");
    }
}

Затем вы можете @Autowire класс Bean, и он автоматически подключит bean-компонент public (не жалуясь на несколько совпадающих bean-компонентов)

Поскольку определение класса (если не встроено) не позволяет использовать средства доступа private / protected, обходной путь будет заключаться в использовании класса @Configuration, который будет создавать экземпляры всех bean-компонентов и публиковать общедоступные bean-компоненты, скрывая приватные/защищенные (вместо прямой аннотации классов @Component\@Service)

Также стоит попробовать метод доступа, защищенный пакетом, чтобы скрыть @Component аннотированных классов. Я не знаю, может ли это сработать.

person Ghurdyl    schedule 10.01.2018
comment
Вы уверены, что Bean Visibility реализована в Spring? - person Whimusical; 31.01.2020
comment
@Whimusical Да, я создал класс, как определено в моем ответе, и автоматически подключил атрибут типа Bean в другой компонент Spring, а Spring ввел «общедоступный» Bean. - person Ghurdyl; 04.02.2020
comment
Я думал о github.com/spring-projects/spring-framework/issues/ 11829 и тот факт, что большая часть документации по этой функции, которую я вижу в сети, относится к Spring 1.0, но они, должно быть, устарели. - person Whimusical; 04.02.2020