使用构造函数参数的依赖注入

时间:2014-06-05 09:22:28

标签: java java-ee dependency-injection cdi

我的 EJB 如下:

public class Bar() {

     private String s;

     public Bar() {
         this.s = "bar";
     }

     @Inject public Bar(String s) {
         this.s = s;
     }

}
  1. 如何通过将 arg-constructor 引入另一个Foo类来注入该bean?

  2. 然后,我将Foo类定义为EJB,目的是将 DI 执行到另一个类(例如,WebServlet)。如何通过将Foo传递给正确设置String arg-constructor作为内部依赖来注入Bar类实例?

  3. 有没有更好的方法来定义Bar以达到上述要点?

2 个答案:

答案 0 :(得分:1)

带注释的构造函数注入告诉CDI,每当有人请求注入Bar实例时,它应该使用标有@Inject的构造函数。

然后,CDI容器尝试获取所有必需构造函数参数的实例并失败,因为它无法处理“String”。它只是不知道你指的是哪个字符串。

您必须通过使用Producer和限定符来帮助容器解析依赖关系,以告诉他您想要的String。我在这里给你最简单的解决方案:

public class Bar {

 @Inject 
 public Bar(@Named("myString") String s) {
     this.s = s;
 }
}

然后是另一个类(不必是一个不同的类,但它更具可读性):

public class MyStringProducer {
  @Produces
  @Named("myString")
  public String getMyString() {
    return ...; // whatever you want ... read JSON, parse properties, randomize ...
  }
}

答案 1 :(得分:0)

@Inject仅在您注射" managed"对象。字符串不是托管对象,因此无法工作。

但是,以下示例应该可行(我在这里使用了spring。根据您使用的库使用DI初始化代码):

@Named
public class Foo {

    @Inject
    Bar bar;

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext("com.pkg1");
        Foo foo = (Foo)ctx.getBean("foo");

        System.out.println(foo.bar.getString());

    }


}

@Named
public class Bar {
    private String s;
    public Bar() {
        this.s = "bar";
    }
   @Inject 
   public Bar(Bar1 bar1) {
        this.s = bar1.getS();
    }
    public String getString() {
        return s;
    }
}

@Named
class Bar1 {
    private String s="bar1";
    public String getS() {
        return s;
    }
}