2016-06-15 2 views
0

guice가 호출되지 않은 Injector 클래스를 공급자와 함께 사용하기 위해 호출하는 인젝터 인스턴스에 바인드하는 것과 비슷한 방식으로 guice에 일부 매개 변수를 바인딩하고 싶습니다. 특히정적으로 바인딩 된 매개 변수로 google guice 사용

, 우리의 프로젝트에서 우리는이 개체는 우아하게이 나타내는 자원에 "COM-경로"(클래스 상대 리소스 경로를) 변환하는 우리를있게, 효과적으로 방법 Class.getClassLoader().getResource()에 대한 래퍼입니다, 물체가 ResourceEnvironment라는이 (FXML 파일, 이미지 파일 등). 우리는이 도구를 사용하여 jar 파일 내에 배포 된 리소스를로드합니다.

는 지금이 코드는 주파수의 엄청난 양을 반복한다 :

Class ClazzX{ 

    private final ResourceEnvironment env; 

    @Inject 
    public ClazzX(ResourceEnvironment.Factory envFactory){ 
    env = envFactory.create(this.getClass()) 
    } 
} 

내가 정말하고 싶은 것이 훨씬 더 간단 :

Class ClazzX{ 

    private @Inject ResourceEnvironment env; 

} 

는하지만, 그렇게, 나는 공급자를 필요로 할 것입니다 :

binder.install(new Module(){ 

    @Provides ResourceEnvironment getResourceEnv(Injector callingInjector){ 
     Class targetClazz = callingInjector.getDependencyBeingResolved(); //not a real method 
     ResourceEnivonment.Factory factory = callingInjector.getInstance(RE.F.class) 
     return factory.create(targetClazz); 
    } 
}); 

cur 런타임에 인젝터를 통해 임대료가 결정됩니까?

+2

class ResourceEnvironmentMembersInjector<T> implements MembersInjector<T> { private final Field field; private final ResourceEnvironment env; ResourceEnvironmentMembersInjector(Field field) { this.field = field; env = envFactory.create(field.getDeclaringClass()); field.setAccessible(true); } public void injectMembers(T t) { try { field.set(t, env); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } } 
: https://tavianator.com/announcing-sangria/ https://github.com/tavianator/sangria –

답변

1

로거의 사용자 정의 주입을 템플릿 (https://github.com/google/guice/wiki/CustomInjections)으로 사용하면 선언 클래스를 환경 주입의 소스로 사용하는 특정 구성원 주입기를 쉽게 구현할 수 있습니다. 내가 아는 바로는 이것에도 맞춤식 주석이 필요합니다.

당신은 내가이 목적을 위해 쓴 라이브러리를 사용할 수 있습니다
관련 문제