コンストラクタ引数による依存噴射
-
26-12-2019 - |
質問
私は次のように EJB です。
public class Bar() {
private String s;
public Bar() {
this.s = "bar";
}
@Inject public Bar(String s) {
this.s = s;
}
}
.
-
arg-constructor を別の
Foo
クラスに使用することで、そのBeanを注入する方法は? -
次に、
Foo
クラスをEJBとして定義し、 di を別のクラスに実行することを目的としています(たとえば、WebServletなど)。Foo
クラスインスタンスを挿入してString
クラスインスタンスを内部依存? として正しく設定することで、どのようにして -
上記の点を達成するために
Bar
を定義するためのより良い方法はありますか?
Bar
クラスインスタンスを注入できますか。
解決
注釈付きコンストラクター噴射は、誰かが挿入するバーのインスタンスを要求するたびにCDIに指示し、それは@Injectでマークされたコンストラクタを使用するべきです。
CDIコンテナは、必要なすべてのコンストラクタパラメータのインスタンスを取得し、「文字列」を処理できないために失敗します。どの文字列を意味するかわからない。
プロデューサーと修飾子を使用して、どの文字列を望むかを伝えることで、コンテナが依存関係を解決するのを助けなければなりません。私はちょうどあなたにここで最も単純な解決策を与える:
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 ...
}
}
. 他のヒント
@Inject
は、 "managed
"オブジェクトを注入しているときにのみ機能します。文字列は管理対象のオブジェクトではなく、これは勝ちました。T work。
しかし、次の例は機能するべきです(ここでは春を使用しています。使用しているライブラリに従ってDI Initializatonコードを使用):
@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;
}
}
. 所属していません StackOverflow