2017-02-23 65 views
0

我有一臺我一直在開發的服務器。它使用Guice爲它。有一個我需要使用的團隊庫。它使用@Autowired爲其DI。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爲空。

我在這裏有什麼選擇。有沒有辦法讓Guice認出@Autowired?如果是用@Inject更新團隊庫替換@Autowired的選項,那麼這項工作是否會很簡單,值得付出努力?假設最壞的情況下,我會堅持用我的DI項目中的Spring替換Guice嗎?

回答

1

Spring支持@Inject,所以如果有可能在你的團隊庫中用@Inject代替@Autowired,一切都應該沒問題。

否則,您可以創建吉斯定製的噴油器,看到這個鏈接:https://github.com/google/guice/wiki/CustomInjections

可以爲@Autowired創建自定義的注射器和使用TypeListenerTypeEncounter類型的方法getProvider(Class)得到一個供應商,你可以使用檢索所需的類型。

當然,你必須正確配置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); 
     } 
    } 
} 

然後只需添加bindListener(Matchers.any(), new AutowiredTypeListener());您吉斯模塊內。 我直接注意到的是@Autowired支持可選注入,這似乎是不可能的,因爲只要使用typeEncounter創建提供者,它就需要綁定註冊的類。