Как объявить 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();
}