Guiceを使用しています。CGLIB を使用してインスタンスを強化したい。基本的には Guice にインスタンスを提供してもらいたいのですが、返す前にそのインスタンスを Enhancer でラップしたいと考えています。Provider を使用することを考えましたが、Guice に依存関係を解決してインスタンスを提供してもらいたいので、それをラップして拡張バージョンを返すことができます。
これを行う最善の方法は何ですか?
必要な注入の柔軟性に応じて、いくつかのオプションがあります。
1 つの方法は、自分でインスタンスを作成し、必要に応じて拡張し、必要に応じて注入されたメソッドを使用してフィールドとメソッドを注入MembersInjector
することです。これにより、コンストラクター注入を使用できなくなるか、少なくともコンストラクター注入を自分で実行する必要がありますが、トリックはきれいに行われます。
public class YourModule extends AbstractModule {
@Override public void configure() { }
@Provides YourClass provideEnhancedYourClass(
MembersInjector<YourClass> yourClassInjector,
YourDependency dependency) {
YourClass yourClass = YourClassEnhancer.enhance(new YourClass(dependency));
yourClassInjector.injectMembers(yourClass);
return yourClass;
}
}
もう 1 つの方法は、もう少し複雑です。Guice は、キーによってインスタンスを提供し、キーによってインスタンスを注入できる必要があるからです。コンストラクター インジェクションを使用できますが、拡張された YourClass を作成するために拡張された YourClass に再帰的に依存しないように、バインディング アノテーションも使用する必要があります。
@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
public @interface Enhanced {}
public class YourModule extends AbstractModule {
@Provides @Enhanced
YourClass provideEnhancedYourClass(YourClass yourClass) {
return YourClassEnhancer.enhance(yourClass);
}
}
@Enhanced YourClass
秘訣は、それらを分離しておくために、YourClass
. そのアノテーションを必要とせずにクラスを返す方法を見つけられるかもしれません。特にインターフェースを抽出して のよう@Provides YourInterface providesEnhancedYourClass(YourClass class)
に表現する場合はそうですが、いずれにせよ、拡張されていないクラスを Guice に提供させるにはもう少し複雑になる必要があります。強化する。