Как объявить Spring bean autowire-candid = "false" при использовании аннотаций?
Я использую @ComponentScan
и @Component
для определения моего spring beans. Я хотел бы объявить один из этих beans autowire-candidate=false
.
Это можно сделать с помощью этого атрибута в xml. Разве нет эквивалента в аннотациях?
Я хочу это потому, что у меня есть 2 реализации одного и того же интерфейса, и я не хочу использовать @Qualifier
.
EDIT: использование @Primary является допустимым обходом, но кандидат на автосдвиг кажется мне полезной функцией с ее собственной семантикой.
Спасибо
Ответы
Ответ 1
Похоже, Spring отказался от концепции autowire-candidate=false
и больше не поддерживается. Аналога с аннотациями нет, поэтому @Primary
- лучшая работа, как вы заметили.
Другим способом является использование пользовательского org.springframework.beans.factory.support.AutowireCandidateResolver
, который используется в DefaultListableBeanFactory
, с логикой, которая исключает нежелательные beans из кандидатов autwire. В этом случае технология будет аналогична технологии, используемой для autowire-candidate=false
в SimpleAutowireCandidateResolver
.
Ответ 2
Вы также можете использовать компонент bean для настройки его visibiltiy.
увидеть видимость 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
и он будет автообновлять public
компонент (не жалуясь на несколько совпадающих компонентов)
Поскольку определение класса (если оно не встроено) не позволяет private
/ protected
@Configuration
работать, было бы использовать класс @Configuration
который бы @Configuration
экземпляр всех компонентов, публиковал публичные бобы, скрывая частные/защищенные (вместо того, чтобы прямо аннотировать классы @Component
\@Service
)
Кроме того, защищенный пакетом аксессуар может попытаться скрыть аннотированные классы @Component
. Я не знаю, может ли это работать.
Ответ 3
Начиная с Spring 5.1, вы можете настроить autowire-candidate
в атрибуте @Bean
- autowireCandidate
:
@Bean(autowireCandidate = false)
public FooBean foo() {
return newFooBean();
}