サードパーティによってインスタンス化されたオブジェクトの中に注入するCDIを使用する方法

アーロン・L:

私はサードパーティ製のコードでインスタンス化されたクラスを持っている(これは、オブジェクトを作成するためにリフレクションを使用しています。)私は自分のインタフェースの実装を提供し、彼らはオブジェクトを作成します。私の実装では、私は実行するロジックというサービスを注入する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);
   }
Siliarus:

限り、誰かが手動でオブジェクトを作成するよう、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あなたが提供する豆?

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=218308&siteId=1