如何使用Guice包装实例

时间:2013-08-21 14:34:28

标签: guice cglib

我正在使用Guice。我想使用CGLIB增强实例。基本上我希望Guice提供实例,但我希望在返回之前用Enhancer包装该实例。 我想过使用Provider,但是我希望Guice解决依赖关系并给我实例,这样我就可以将它包装起来并返回增强版本。

这样做的最佳方式是什么?

1 个答案:

答案 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提供一个更复杂的方法没有增强的课程,你可以提升。