我正在使用Guice。我想使用CGLIB来增强实例。基本上我想让Guice提供这个实例,但是我想在返回它之前用Enhancer包装那个实例。 我想过使用Provider,但是我希望Guice解决依赖关系并给我实例,以便我可以包装它并返回增强版本。如何使用Guice包装实例
这样做的最好方法是什么?
我正在使用Guice。我想使用CGLIB来增强实例。基本上我想让Guice提供这个实例,但是我想在返回它之前用Enhancer包装那个实例。 我想过使用Provider,但是我希望Guice解决依赖关系并给我实例,以便我可以包装它并返回增强版本。如何使用Guice包装实例
这样做的最好方法是什么?
您有几个选择,取决于您需要多少注射灵活性。
一种方法是自己创建实例,根据需要对其进行增强,然后根据需要对其进行增强,然后使用inject the fields and methods using an injected 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;
}
}
另一种方法是稍微复杂一点,因为吉斯需要能够提供实例通过一些密钥并通过一些密钥注入。你得到使用构造器注入,但你也必须使用binding annotations这样你就不会递归地依赖于增强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为您提供一个未增强的类要稍微复杂一些加强。
提供商应该做的伎俩,你能提供你的代码? Specialy你想要注入的课程,以及如何包装它。 – NiziL