Me encuentro con un código que tiene un comportamiento extraño @Qualifier . No es lo que esperaría.
Consideremos el siguiente fragmento de código:
@SpringBootApplication class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Bean Foo foo1() { return new Foo("foo1"); } @Bean Foo foo2() { return new Foo("foo2"); } static class Foo { private final String name; public Foo(String name) { this.name = name; } public String getName() { return name; } } @Component static class Bar { private Foo fooOne; private Foo fooTwo; @Autowired @Qualifier("foo3") void setFoo(Foo foo1, Foo foo2) { this.fooOne = foo1; this.fooTwo = foo2; } @PostConstruct void printFoo() { System.out.println(fooOne.getName() + fooTwo.getName()); } } } El código anterior no funciona porque no hay un frijol Foo llamado foo3 . Esto es exactamente lo que espero. Ahora cambiemos la definición de la clase Foo para incluir un @Qualifier :
@Qualifier("foo3") static class Foo { // remaining code not changed.. Con ese cambio, el @Qualifier on Bar::setFoo parece ignorarse y se inyectan las instancias foo1 y foo2 . Ningún bean con id foo3 está presente en el contexto. Me cuesta entender el mecanismo aplicado aquí. ¿Alguien puede explicarlo?
Al poner el calificador en la clase Foo:
@Qualifier("foo3") static class Foo { ... } Cada bean instanciado como una clase Foo tendrá el calificador dado. Tiene razón en que no es un solo bean con id foo3 , sin embargo, hay dos beans presentes con un calificador foo3 .
Más información sobre el tema se puede encontrar aquí .
Para inyectar ambos beans, elimine el calificador en la clase estática y agregue un calificador en ambos parámetros:
@Autowired void setFoo(@Qualifier("foo1") Foo foo1, @Qualifier("foo2") Foo foo2) {Para jugar con beans en el contexto de una aplicación, sugiero inyectar el contexto de la aplicación y recuperar los beans para inspeccionarlos. Por ejemplo:
@SpringBootApplication class DemoApplication { @Autowired ApplicationContext context @PostConstruct public void init() { // Beans by qualifier BeanFactoryAnnotationUtils.qualifiedBeanOfType(context.getBeanFactory(), YourClass.class, "foo3"); } ... }