我正在使用 Guice。我想使用 CGLIB 增强实例。基本上我希望 Guice 提供实例,但我想在返回之前用 Enhancer 包装该实例。我想过使用 Provider,但是我希望 Guice 解决依赖关系并给我实例,以便我可以包装它并返回增强版本。
做这个的最好方式是什么?
您有几个选择,具体取决于您需要多少注射灵活性。
一种方法是自己创建实例,根据需要对其进行增强,然后根据需要使用注入的方法注入字段和方法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 需要能够通过某个键提供实例,并通过某个键注入它。您确实可以使用构造函数注入,但您还必须使用绑定注释,因此您不会递归地依赖增强的 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
. 您可能能够找到一种无需注释即可返回类的方法,特别是如果您提取接口并将其表述为 like @Provides YourInterface providesEnhancedYourClass(YourClass class)
,但无论哪种方式,让 Guice 为您提供未增强的类都必须稍微复杂一点提高。