2013-08-21 28 views
1

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

这样做的最好方法是什么?

+0

提供商应该做的伎俩,你能提供你的代码? Specialy你想要注入的课程,以及如何包装它。 – NiziL

回答

0

您有几个选择,取决于您需要多少注射灵活性。

一种方法是自己创建实例,根据需要对其进行增强,然后根据需要对其进行增强,然后使用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为您提供一个未增强的类要稍微复杂一些加强。

相关问题