我正在使用Guice。我想使用CGLIB增强实例。基本上我希望Guice提供实例,但我希望在返回之前用Enhancer包装该实例。 我想过使用Provider,但是我希望Guice解决依赖关系并给我实例,这样我就可以将它包装起来并返回增强版本。
这样做的最佳方式是什么?
答案 0 :(得分:1)
您有几种选择,具体取决于您需要多少注射灵活性。
一种方法是自己创建实例,根据需要进行增强,然后根据需要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;
}
}
另一种方式稍微复杂一点,因为Guice需要能够通过某些键提供实例,并且还可以通过某些键注入它。您可以使用构造函数注入,但您还必须使用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提供一个更复杂的方法没有增强的课程,你可以提升。