私はJavaEEとDependency Injectionのコンセプトについてかなり新しいです。しかし、私はそれが使用可能なすべての方法を知らないけれども、私はそれを公正に理解しています。インタフェース、外部ライブラリクラスをJavaEEアプリケーションにインジェクトする方法はありますか?
私は以下のようにローカル・インタフェースを持っている:
@Local
public interface MyInterfaceLocal {
SomeType getMeSometype();
}
このインタフェースはステートレスEJBで実装するクラス。
@Stateless
public class MyInterfaceImpl {
public SomeType getMeSomeType() {
//Some implementation details...
ExternalLibraryClass externalLib = new ExternalLibrary(arg1, arg2);
return externalLib.externalLibMethod();
}
}
今の問題は、私はexternalLib
をインスタンス化しないよう、これは何らかの方法で注入することができましょうか、でしょうか?たとえば、これがインターフェイスで作成した別のEJBだった場合は、単にEJBコンテナにインスタンス化を処理させ、以下のような@EJB
注釈を付けることができます。
@Stateless
public class MyInterfaceImpl {
@EJB
AnotherInterface anotherInterfaceImpl;
public SomeOtherType getMeSomeType() {
//Some implementation details...
return anotherInterfaceImpl.someMethod();
}
}
:
- 変更、現在で使用されている基本的な外部ライブラリ私のコードベースへの最小限の変更。必要に応じてより良いものに変更することができます。
MyInterfaceImpl
クラスを単体テストしたいときは簡単にモックを注入してください。
私はこれまでのところ、そのパラメータExternalLibrary
であるため、手動メソッドパラメータインジェクションのいくつかの種類を実行することができラッパー・メソッドを作成するアット
を見てきました。これにより、私の実装は基本的なライブラリと密接に結びついています。 (または私はそれを正しくやっていません)
Context & Dependency Injection
コンテナを使用して(EJBコンテナと同じように)私はそれが同じではないことを認識しています。Producers
を使用する能力について調査しました。私はProducers
がCDIに関して何をするのか理解していますが、私はこれをどのように利用できるかについて私の頭を包み込むことはできませんか?あるいは、私が正しい道にいても?
UPDATE: 私は私がより良いCDIプロデューサーを理解する助けと私はそのアプローチで行く試みたが、別の問題に直面したいくつかの記事を見つけました。だから今、私が持っている:
ExternalLibraryProducer.java
public class ExternalLibraryProducer {
@Produces
private ExternalLibraryClass1 extrnalLibraryClassProducer() {
return new ExternalLibraryClass1("SomeString", 7);
//The constructor actually takes a string and another commplex type
//as parameters. I am keeping it a little simple here.
//I am trying to set the ExternalLibraryClass1() arguments
//programmatically at runtime.
}
}
は、今私が生産するオブジェクトのコンストラクタは、パラメータにとり、文字列と整数を言うことができます。私はQualifier
を作成して、これらのパラメータを渡して、私が望むオブジェクトを生成できると考えました。
ExternalLibraryClass1Qualifier.java
@Qualifier
@Retention(RUNTIME)
@Target({METHOD})
public @interface ExternalLibraryClass1Qualifier {
String argument1();
Int argyment2(); //This is actually another complex type. Keeping it
//simple here.
}
今、私が何をしたいのか、私は引数の値は、(プロパティファイルから、想定する)、実行時にプログラムによって設定することにしたい、です。そして、私はこれを行う方法を理解することができません。最終注射は以下のようになります。
@Stateless
public class MyInterfaceImpl {
@Inject
@ExternalLibraryClass1Qualifier(argument1 = "something", argument2 = 7)
ExternalLibrary externalLib;
public SomeType getMeSomeType() {
//Some implementation details...
return externalLib.externalLibMethod();
}
}
ありがとうございました。
CDIプロデューサは良いアプローチのように見えますが、修飾子の引数はここではそのトリックを行いません - 注入ポイントが一致しませんでした。(生成物が読み込みを行うときには問題はないはずです。プロデューサーの方法だと思います。おそらくアプローチを逆転させ、オブジェクトを作成する際にプロデューサが見えるところに 'argument1'と' argument2'をどこかに保存しておきますか? – Siliarus