2017-11-12 19 views
1

내 코드가 Google guice에있는 동안 Spring을 기반으로하는 외부 jar를 사용하는 곳이 있습니다.Guice 주석을 추가하지 않고 Guice DI 바인딩

모듈을 작성하여이 종속성 클래스의 종속성을 주입하려고합니다.

외부 클래스 : 내 모듈에 @provides 방법에 세터와 구성원을 설정할 수 있어요

public class PTRS { 
    @Inject 
    private Event countEvent; 
    @Inject 
    private Event durationEvent; 
    private GeoServiceClient gClient; 
    public void setGeoServiceClient(GeoServiceClient client){this.gClient=client} 

} 

하지만, @Inject 회원은 널 (null)이 있고, 나는 countEvent 및 durationEvent에 대한 NullPointerException이 무엇입니까.

내 코드는 다음 공급자 클래스를 사용하여 PTRS 클래스와 바인딩 할 개체를 만듭니다.

@Provides 
PTRS new PTRS(Client client){ 
PTRS ptrs = new PTRS(); 
ptrs.setGeoServiceClient(client); 
return ptrs; 
} 

외부 클래스를 변경하지 않고 이러한 종속성을 모두 주입 할 수 있습니까?

답변

2

MembersInjector 을 입력하여 Guice가 만들지 않은 개체에 @Inject - 주석이있는 필드를 채 웁니다 (그리고 @Inject -annotated 메서드 호출). Guice는 wiki에서이 단어를 "On-demand injection"라고 부르지 만 다른 곳에서는이 용어를 듣지 못했습니다. 당신이 자체 주사 인 Injector에 액세스 할 수있는 경우

@Provides 
PTRS newPTRS(Client client, MembersInjector<PTRS> ptrsInjector){ 
    PTRS ptrs = new PTRS(); 
    ptrsInjector.injectMembers(ptrs); // <-- inject members here 
    ptrs.setGeoServiceClient(client); 
    return ptrs; 
} 

직접 injectMembers(Class) 전화하거나 원하는 유형의 MembersInjector 인스턴스를 얻을 수 getMembersInjector를 호출 할 수 있습니다. 그러나 여기서 가장 좋은 방법은 읽기 쉽고 조롱하기 쉽도록 가능한 한 인터페이스의 범위를 좁히는 것입니다.

+0

Jeff에게 감사드립니다. 공장! :) –