私はサードパーティ製のコードでインスタンス化されたクラスを持っている(これは、オブジェクトを作成するためにリフレクションを使用しています。)私は自分のインタフェースの実装を提供し、彼らはオブジェクトを作成します。私の実装では、私は実行するロジックというサービスを注入するCDIを使用したいです。これを実行するための正しい方法は何ですか?
public interface ThirdPartyInterface {
public void DoSomething();
}
public class InjectedService {
public void DoSomeLogic() { ... }
}
public class MyImplementation implements ThirdPartyInterface {
@Inject InjectedService service;
@Override
public void DoSomething() {
service.DoSomeLogic();
}
}
私はもともと、これはCDIの魔法を介して動作するだろうと思ったが、私のサービスオブジェクトがnullであることが判明しました。
私がこれまでに作ってみた唯一のことは、コンストラクタで手動でサービスを注入することです
public MyImplementation() {
CDI<Object> cdi = CDI.current();
service = cdi.select(InjectedService.class).get();
}
これは、インスタンスを取得する正しい/だけ/最良の方法ですか?私は私のCDIの実装のための溶接を使用しています。
私はまた、コンストラクタでの作業にこれを発見しました。
public MyImplementation() {
CDI<Object> cdi = CDI.current();
BeanManager bm = cdi.getBeanManager();
AnnotatedType<MyImplementation> myType = bm.createAnnotatedType(MyImplementation.class);
Set<Bean<?>> beans = bm.getBeans(MyImplementation.class);
Bean<?> bean = bm.resolve(beans);
@SuppressWarnings("unchecked")
CreationalContext<MyImplementation> cc = (CreationalContext<MyImplementation>)bm.createCreationalContext(bean);
bm.createInjectionTarget(myType).inject(this, cc);
}
限り、誰かが手動でオブジェクトを作成するよう、CDIはデフォルト、それに注入何によって、しません。
あなたは耳となに入るしない限り、コンストラクタ・インジェクションは、おそらく、仕事に行くされてアプローチCDI.current()
あなたが期待するものを行うことがありません。
手動で作成されたオブジェクトにCDIの注入を作るための方法があります-サードパーティはそれを動作させるために、このステップを取る必要があります。あなたは必要BeanManager
とあなたがに注入するインスタンス:
BeanManager beanManager = ...; // get hold of bean manager, can be injected
CreationalContext<Object> ctx = beanManager.createCreationalContext(null);
@SuppressWarnings("unchecked")
InjectionTarget<MyImplementation> injectionTarget = (InjectionTarget<MyImplementation>) beanManager
.getInjectionTargetFactory(beanManager.createAnnotatedType(myImplementationInstance.getClass())).createInjectionTarget(null);
injectionTarget.inject(myImplementationInstance, ctx);
注-これを行うことによって、あなたは、もはやそれを必要としたら、オブジェクトの後にクリーンアップしないように責任を取ります。保管CreationContext
どこかとコールrelease()
(すべての可能な事前破棄コールやなと)適切に廃棄するために、その上に方法を。
すでにCDIを使用しているので、また、なぜサードパーティが単にない@Inject
あなたが提供する豆?