2013-08-21 4 views
1

Guice를 사용하고 있습니다. CGLIB를 사용하여 인스턴스를 향상시키고 싶습니다. 기본적으로 나는 Guice가 인스턴스를 제공하기를 원한다. 그러나 반환하기 전에 그 인스턴스를 Enhancer로 랩핑하고 싶다. Provider를 사용하려고 생각했지만, Guice가 의존성을 해결하고 인스턴스를 포기하여 확장 된 버전으로 되돌릴 수있게 해달라고합니다.Guice를 사용하여 인스턴스를 래핑하는 방법

가장 좋은 방법은 무엇입니까?

+0

제공자가 트릭을 수행해야합니다. 코드를 제공 할 수 있습니까? 당신이 주사하고 싶은 클래스를 어떻게 감쌀 것인가? – 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; 
    } 
} 

또 다른 방법은 좀 더 복잡하다, Guice 인스턴스를 제공 할 수 있어야하기 때문에 어떤 열쇠로 또한 어떤 열쇠로 그것을 주입하십시오. 당신은 생성자 주입을 사용하려면 어떻게해야합니까,하지만 당신은 또한 향상된 YourClass 만들 그래서 당신은 재귀 적으로 강화 된 YourClass에 의존하지 않는 binding annotations을 사용해야합니다 : 트릭은

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

를, 당신이 필요로하는, 그들이 분리 유지 단지 YourClass이 아닌 @Enhanced YourClass의 주사를 요구하십시오. 해당 주석을 사용하지 않고 클래스를 반환하는 방법을 알아낼 수 있습니다. 특히 인터페이스 및 구문을 @Provides YourInterface providesEnhancedYourClass(YourClass class)과 같이 추출하면 Guice가 확장되지 않은 클래스를 제공하도록 조금 더 복잡해 져야합니다. 향상.

관련 문제