2017-06-07 9 views
1

私のプロジェクトにはいくつかの外部Javaインターフェイスがあります(変更できません)。 など。java - CDI経由でプロキシを注入

public interface Abc 
{ 
    void do123(); 
} 

豆で私はこのインターフェイスを注入するのが好きです。 など。

public class TestAbc 
{ 
    @Inject 
    private Abc abc; 
} 

しかし、私はこのインターフェイスまたはプロデューサメソッドの実装を持っていません。代わりに、私はこのインターフェイスの汎用プロキシを注入する方法を探しています。

私はこのようなことをするにはcdi拡張のようなものが必要だと思います。不幸にも私はこのためにどのように良い方法を見つけることができません。 最適な世界で私はこのような方法を実装することを期待しています。

public Object produce(Class<?> type) 
{ 
    if(isMyType(type)) 
    { 
     // I can produce this type 
     return createProxy(type); 
    } 
    return null; // this method can't produce this type 
} 

どのようにすればいいですか?

よろしく ヨハネスので

+0

はこれを見ている:https://bitbucket.org/marembo2008/khameleon/src/4231200bb5b618e3e4cae569f111115685f4e1dd/khameleon-spi/src/main/java/com/anosym/khameleon/core/spi/extension/ConfigServiceExtension.java ?at = master&fileviewer =ファイルビューデフォルト – maress

+0

これを少し拡張できますか?インターフェイスにインプリメンテーションがない場合は、何を注入すると思われますか? 「プロキシ」は何をしますか?実際に実装する必要があるため、実装するか、他のライブラリで実装します。 – Siliarus

+0

@Siliarus私の考えは、Javaプロキシがこのインタフェースを "偽造"できるということです。私の具体的な使用例は、クライアントにEJB RMIインタフェースを注入することです。異なるRMIインタフェースでは、プロダクトメソッドは常に非常によく似ています。 https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI lookupRemoteStatefulCounter()を参照してください。適切なファイルに格納してプロキシにロードするのが好きな特定のインタフェースに必要なパラメータ。 – Johannes

答えて

1

、最終的に私はそれを得ました。 私の場合、ProcessInjectionPointとAfterBeanDiscoveryを聞くCDI拡張が必要でした。 ProcessInjectionPointはすべての関連する注入用インターフェイスを収集し、AfterBeanDiscoveryはこのインターフェイス用のBeanを作成します。

注入が関連するかどうかのチェックは、@RMIの注釈によって行われます。 @RMIは、独自の修飾子注釈です。 RMILifecyleは、注入されたオブジェクトを構築または破壊します。 ここにいくつかのソースコード。

public class RMIInjectionExtension implements Extension 
{ 
    private Set< Class<?> > interfaces = Sets.newHashSet(); 

    void processInjectionPoint(@Observes final ProcessInjectionPoint< ?, ? > aProcessInjectionPoint) 
    { 
     // collecting all relevant interfaces 
     if(aProcessInjectionPoint.getInjectionPoint().getQualifiers().stream() 
      .anyMatch(RMI.class::isInstance)) 
     { 
      interfaces.add((Class<?>)aProcessInjectionPoint.getInjectionPoint().getType()); 
     } 
    } 

    void afterBeanDiscovery(@Observes final AfterBeanDiscovery aAfterBeanDiscovery, 
     BeanManager aBeanManager) 
    { 
     // create beans for the interfaces 
     // using DeltaSpike BeanBuilder 
     interfaces.stream().map(a -> new BeanBuilder<Object>(aBeanManager).beanClass(a) 
      .qualifiers((RMI)() -> RMI.class).beanLifecycle(new RMILifecyle()).create()) 
      .forEach(aAfterBeanDiscovery::addBean); 
    } 
} 

これは私にとってはうまくいきます。

関連する問題