首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >爪哇豆复合注射

爪哇豆复合注射
EN

Stack Overflow用户
提问于 2016-04-27 16:42:04
回答 1查看 934关注 0票数 2

我有个接口

代码语言:javascript
复制
public interface Abstraction { 
    void execute();
}

我已经构建了一个复合实现,并希望将这个对象注册为bean,@Named

代码语言:javascript
复制
@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中。

代码语言:javascript
复制
public class Implementation1 implements Abstraction {
    public void execute() { }
}

public class Implementation2 implements Abstraction {
    public void execute() { }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-27 17:00:56

如果您为每个实现创建了一个bean,那么您的示例就会开箱即用。例如,用@Named@Component注释您的实现,并标记它们进行扫描(组件扫描它们的包)。

代码语言:javascript
复制
@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并分别注入它们。例如

代码语言:javascript
复制
@Component("one")
class Implementation1 implements Abstraction {
    public void execute() {
    }
}

@Component("two")
class Implementation2 implements Abstraction {
    public void execute() {
    }
}

并将它们注入Composite

代码语言:javascript
复制
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可能会更清楚。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36895893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档