Бин получает инъекцию eventhough значение @Qualifier не совпадает в Constructor Injection - PullRequest
2 голосов
/ 22 марта 2020

Я пытаюсь внедрить конструктор, используя @ Autowired и @ Qualifier весной 5.

    public class A {

    private int a;

    public void setA(int a) {
        this.a = a;
    }

    @Override
    public String toString() {
        return "A [a=" + a + "]";
    }
}

Класс Hello

    public class Hello {

    private A aobj;

    @Autowired
    public Hello(@Qualifier("a01") A aobj) {
        this.aobj = aobj;
    }

    public void show() {
        System.out.println("aobj : " + aobj);
    }
}

Класс конфигурации

    @Configuration
public class JavaConfig {

    @Bean(name = "a02")
    public A createA1() {
        A ob = new A();
        ob.setA(199);
        return ob;
    }

    @Bean
    public Hello hello(A aobj) {
        return new Hello(aobj);
    }
}

Основной класс

public static void main(String[] args) {

    ApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);
    System.out.println("--------Spring Container is ready----------");  
    Hello hello = (Hello)ctx.getBean("hello");
    hello.show();
}

Выход:

--------Spring Container is ready----------
aobj : A [a=199]

Намеренно я даю неправильное значение ( a02 ) для имени компонента в классе конфигурации, которое не совпадает со значением @Qualifier ( a01 ) в Hello Класс.

В результате того, что я наблюдаю, компонент A успешно внедряется в Hello Bean.

В идеале это должно произойти из-за ошибки, поскольку в контейнере нет ожидаемого совпадающего компонента с именем * 1036. * a01 найдено, в противном случае какой смысл использовать @Qualifier в этом случае.

Может ли кто-нибудь осветить это. Спасибо !!

1 Ответ

2 голосов
/ 22 марта 2020

Проблема здесь в том, что вы не используете автопроводку при создании компонента Hello! Вместо этого вы пишете свой собственный фабричный метод hello и сами вызываете конструктор. @Qualifier - это примечание, которое контейнер читает при создании экземпляра класса, а не какая-то проверка, встроенная в сам конструктор (как некоторые инструменты могут делать с @Nonnull).

Если вам нужно продолжить используя @Bean, вам нужно применить @Qualifier к параметру метода. Еще проще, просто примените @Import(Hello.class) к вашему JavaConfig и позвольте Spring разобраться в этом за вас.

...