Используя @Qualifier + @Bean (autowire = Autowire.BY_TYPE) в javaConfig

У меня есть bean-компонент Employee с типом зависимости Address. Пытаюсь настроить автоподключение в javaConfig. Но получаю NoQualifyingBeanException.
Хотя я использую аннотацию @Qualifier() следующим образом:

@Configuration
public class MyConfig {

    @Bean(name = "addr1")
    public Address address() {      
        return new Address("Hello","hi",112233);
    }

    @Bean(name = "address")
    public Address addressAgain() {
        return new Address("See You","Bi",114422);
    }

    @Bean(name = "emp",autowire=Autowire.BY_TYPE)
    @Qualifier("addr1")
    public Employee employee() {

        Employee e = new Employee();
        e.setName("Raghu");
        e.setEmpID(111);
        //e.setAddress(address());

        return e;
    }

}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
145
1

Ответы 1

Недостаточно указывать разные атрибуты name в каждом методе @Bean. Вам следует подумать о том, чтобы пометить один из bean-компонентов как @Primary:

@Primary
@Bean(name = "address")
public Address addressAgain() {
    return new Address("See You");
}

А остальные оставьте без:

@Bean(name = "addr1")
public Address address() {      
    return new Address("Hello","hi", 112233);
}

Обратите внимание, что вам не нужно добавлять аннотацию @Qualifier("addr1") в метод employee(), чтобы иметь возможность автоматически подключать bean-компонент addr1. Spring уже знает экземпляр bean-компонента Address, на который вы ссылаетесь при установке зависимости от метода @Bean: address().

Так что достаточно:

@Bean(name = "emp", autowire = Autowire.BY_TYPE)
public Employee employee() {
    Employee e = new Employee();
    e.setName("Raghu");
    e.setAddress(address());
    return e;
}

Другие вопросы по теме