Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

252
Vistas
Comportamiento extraño de Spring @Qualifier con inyección de setter

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?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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"); } ... }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda