スプリングは@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
を使用してプロバイダを作成するとすぐに登録されたクラスのバインディングが必要になるため、これは不可能です。