2017-02-23 4 views
0

私は開発しているサーバーを持っています。これはGuiceをDIとして使用します。私が使用する必要のあるチームライブラリがあります。 DIのために@Autowiredを使用します。Java:GuiceプログラムでSpring Autowiredライブラリを使用する

私のコード

import team.requiredlibrary.NeededClass 

public class MyClass extends NeededClass { 
    @Inject 
    public MyClass() { 

    } 
} 

インポートライブラリ

public class NeededClass { 
    @Autowired 
    private NestedClass1 nestedClass1; 

    @Autowired 
    private NestedClass2 nestedClass2; 
} 

これを実行すると、nestedClass1とnestedClass2がnullです。

ここには何がありますか? Guiceに@Autowiredを認識させる方法はありますか? @Autowiredを@Injectに置き換えたチームライブラリを更新するオプションがあれば、その作業は簡単で努力する価値がありますか?最悪の場合を想定して、Diの私のプロジェクトでGuiceをSpringに置き換えようと思いますか?

答えて

1

スプリングは@Injectをサポートしていますので、@Autowired@Injectをチームライブラリに置き換えることができます。あなたが使用できるプロバイダを取得するために、あなたは@Autowiredのカスタムインジェクタを作成し、TypeListenerの種類TypeEncounterの方法getProvider(Class)を使用することができますhttps://github.com/google/guice/wiki/CustomInjections

そうしないとあなたが見る、このリンクをGuiceのためのカスタムインジェクターを作成することができます必要なタイプを取得します。

もちろん、これらのタイプを注入できるようにGuiceを正しく設定する必要があります。

このアプローチの問題:Springがサポートしているすべてのもの、 g。 @Qualifier注釈。

public class AutowiredTypeListener implements TypeListener { 
    public <I> void hear(TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) { 
     Class<?> clazz = typeLiteral.getRawType(); 
     while (clazz != null) { 
      for (Field field : clazz.getDeclaredFields()) { 
       Autowired annotation = field.getAnnotation(Autowired.class); 
       if (annotation != null) { 
        typeEncounter.register(new AutowiredMembersInjector<I>(field, 
          typeEncounter.getProvider(field.getType()))); 
       } 
      } 
      clazz = clazz.getSuperclass(); 
     } 
    } 
} 

public class AutowiredMembersInjector<T> implements MembersInjector<T> { 
    private final Field field; 
    private final Provider<?> instanceProvider; 

    public AutowiredMembersInjector(Field field, Provider<?> instanceProvider) { 
     this.field = field; 
     this.instanceProvider = instanceProvider; 

     field.setAccessible(true); 
    } 

    public void injectMembers(T t) { 
     try { 
      field.set(t, instanceProvider.get()); 
     } catch (IllegalAccessException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

そしてちょうどあなたのGuiceのモジュール内bindListener(Matchers.any(), new AutowiredTypeListener());を追加します。ここでは

は実施例です。 私が直接気づいたのは、@Autowiredは任意の注射をサポートしているということです。typeEncounterを使用してプロバイダを作成するとすぐに登録されたクラスのバインディングが必要になるため、これは不可能です。

関連する問題