自动装配名称以特定后缀结尾的组件

时间:2018-10-17 15:58:17

标签: java spring spring-boot dependency-injection

有没有一种方法可以自动装配名称带有特定后缀的组件?

假设我有这个interface

public interface Foo {
    void bar();
}

我有一些实现该接口的具体类

@Component
public class AFooImpl1 implements Foo { ... }

@Component
public class SomeFooImpl1 implements Foo { ... }

@Component
public class OtherFooImpl2 implements Foo { ... }

现在我想要一个class,它只能自动在ListSet内将名称以“ Impl1”结尾的具体类自动装配,如下所示:

public class Client {
    @Autowired
    private List<Foo> foos;
    ...
}

我该怎么做?

有这样的东西吗?

public class Client {
    @Autowired
    @Suffix("Impl1")
    private List<Foo> foos;
    ...
}

还是这个?

public class Client {
    @Autowired
    @Qualifier(suffix("Impl1"))
    private List<Foo> foos;
    ...
}

1 个答案:

答案 0 :(得分:0)

我不知道您的建议是否可行。在您遇到的情况下我会怎么做:

public class Client {
    private List<Foo> foos;

    @Autowired(required = false)
    public Client(List<Foo> myFoos) {
        this.foos = myFoos.stream()
                .filter(foo -> foo.getClass().getName().endsWith("Impl1"))
                .collect(toList());
    }

    @Autowired(required = false)
    public Client() {
        this.foos = new ArrayList<>();
    }
}

您将为所有Foo实例自动接线并对其进行过滤。这样,客户端将仅拥有所需的foos。