2

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

做这个的最好方式是什么?

4

1 回答 1

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;
  }
}

另一种方式稍微复杂一些,因为 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 为您提供未增强的类都必须稍微复杂一点提高。

于 2013-08-26T23:23:54.653 回答