Actualmente estoy inyectando una lista de Spring @Component que implementan la misma interfaz. Esto funciona bien, sin embargo, quiero inyectar esta misma lista en una instancia de un bean en esa lista para poder actuar sobre todos los demás frijoles en esa lista. No puedo ver cómo excluir un bean específico de esa inyección, puedo filtrar la lista después de inyectarlo, pero esto, por supuesto, da como resultado una excepción de dependencia circular de Spring al inicio. Mi pregunta es, ¿puedo, en el momento de la inyección, decirle a Spring que excluya la clase que se está inyectando de la lista de beans?
public interface Foo { String doSomething(); } @Component public class Foo1 implements Foo { private final List<Foo> foos; public Sample(final List<Foo> foos) { //Don't include Foo1 this.foos = foos; } public String doSomething() { foos.forEach(foo -> foo.doSomething()); return "aString"; } } @Component public class Foo2 implements Foo { private final List<Foo> foos; public Sample(final List<Foo> foos) { //Don't include Foo2 this.foos = foos; } public String doSomething() { foos.forEach(foo -> foo.doSomething()); return "anotherString"; } } @Component public class Foo3 implements Foo { //and so onEn lugar de inyectar una lista en el constructor, puede buscar todos los beans de tipo Foo en los métodos doSomething y luego excluir el actual. Para buscar, use cualquiera de los métodos de BeanFactoryUtils , como beanNamesForTypeIncludingAncestors , y luego excluya foo1 , que es el nombre del bean para la clase Foo1 . La búsqueda puede incluso codificarse en un método predeterminado en la interfaz Foo .