我有个接口
public interface Abstraction {
void execute();
}我已经构建了一个复合实现,并希望将这个对象注册为bean,@Named
@Named
public class Composite implements Abstraction {
private List<Abstraction> list;
@Inject
public Composite(List<Abstraction> list) {
this.list = list;
}
public void execute() {
list.forEach(Abstraction::execute);
}
}我如何设置它,以便将抽象的一组实现正确地注入到上面的组合中?我将有另一个将抽象作为依赖项的对象,我希望它接收上面的@Named组合,并将下面的2个实现注入到ctor中。
public class Implementation1 implements Abstraction {
public void execute() { }
}
public class Implementation2 implements Abstraction {
public void execute() { }
}发布于 2016-04-27 17:00:56
如果您为每个实现创建了一个bean,那么您的示例就会开箱即用。例如,用@Named或@Component注释您的实现,并标记它们进行扫描(组件扫描它们的包)。
@Configuration
@ComponentScan
public class StackOverflow {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(StackOverflow.class);
System.out.println(ctx.getBean(Composite.class).list);
}
}
interface Abstraction {
void execute();
}
@Named
class Composite implements Abstraction {
List<Abstraction> list;
@Inject
public Composite(List<Abstraction> list) {
this.list = list;
}
public void execute() {
list.forEach(Abstraction::execute);
}
}
@Named
class Implementation1 implements Abstraction {
public void execute() {
}
}
@Named
class Implementation2 implements Abstraction {
public void execute() {
}
}Composite的列表将包含这两种实现。
或者,由于您只有两个实现,所以可以将它们命名为bean并分别注入它们。例如
@Component("one")
class Implementation1 implements Abstraction {
public void execute() {
}
}
@Component("two")
class Implementation2 implements Abstraction {
public void execute() {
}
}并将它们注入Composite中
List<Abstraction> list = new ArrayList<>(2);
@Inject
public Composite(@Qualifier("one") Abstraction one, @Qualifier("two") Abstraction two) {
list.add(one);
list.add(two);
}我建议这个解决方案,仅仅是因为Abstraction bean的初始化顺序可能会破坏上下文初始化。例如,如果Implementation1在某种程度上依赖于Composite的初始化,那么上下文就会发出抱怨。这是罕见的,你可以用其他方式控制它。不过,在这种情况下,清楚地了解bean可能会更清楚。
https://stackoverflow.com/questions/36895893
复制相似问题