Spring支持@Inject
,所以如果有可能在你的團隊庫中用@Inject
代替@Autowired
,一切都應該沒問題。
否則,您可以創建吉斯定製的噴油器,看到這個鏈接:https://github.com/google/guice/wiki/CustomInjections
可以爲@Autowired
創建自定義的注射器和使用TypeListener
的TypeEncounter
類型的方法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
創建提供者,它就需要綁定註冊的類。