2011-01-26 2 views
18

Java로 작성된 모니터링 소프트웨어의 경우 Google Guice를 DI 제공 업체로 사용하는 것이 좋습니다. 프로젝트는 외부 자원 (파일 또는 데이터베이스)에서 구성을로드해야합니다. 응용 프로그램은 독립 실행 형 모드 나 서블릿 컨테이너에서 실행되도록 설계되었습니다.Guice 및 일반 응용 프로그램 구성

현재 구성에는 일부 전역 응용 프로그램 설정 (JDBC 연결 정의 및 연관된 데이터베이스 관리/모니터링 객체) 만 종속성 삽입을위한 바인딩 또는 매개 변수가 포함되어 있지 않습니다. (다른 많은과) 파일 및 JDBC 구성 소스

또는

  • 을 지원하는, 예를 Apache Commons Configuration를 들어,

    • 다른 라이브러리를 사용하기 :

      나는 두 가지 옵션 참조 Guice를위한 파일 기반의 addon을 응용 프로그램 옵션을 저장하기 위해 guice-xml-config과 같이 사용하십시오 (DI 부분이 필요할 때 나중에 구성 할 수 있습니다). sary).

    두 작업에 Guice를 사용하거나 일반 응용 프로그램 구성을 종속성 삽입과 별도로 유지 하시겠습니까? 가장 중요한 이점과 단점은 무엇이라고 생각하십니까?

답변

29

그것은 Guice 모듈 속성 파일을 후루룩 소리 내며 먹기 위해 간단합니다 :

public class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
    try { 
     Properties properties = new Properties(); 
     properties.load(new FileReader("my.properties")); 
     Names.bindProperties(binder(), properties); 
    } catch (IOException ex) { 
     //... 
    } 
    } 
} 

나중에는 다른 설정 소스에 등록 전환하기 쉽습니다.

[편집]

BTW, 당신은 @Named("myKey")으로 주석에 의해 주입 된 특성을 얻을 수 있습니다.

+1

1로 모듈을 ConfigurationModule을 설치해야합니다 난 당신이 또한 언급해야한다고 생각 :로

당신은 당신의 서비스에 파일 application.conf에서 속성을 삽입 할 수 @라는 속성을 사용하여 속성을 주입하는 방법. – ColinD

1

내 프로젝트에서 같은 문제가 발생했습니다. 우리는 이미 Guice를 DI 프레임 워크로 선택했고 구성을 사용하여 간단하게 사용하기를 원했습니다.

Apache Commons Configuration을 사용하여 등록 정보 파일에서 구성을 읽은 다음 guice FAQ How do I inject configuration parameters?에서 제안한 Guice 인젝터에 바인딩합니다.

@Override public void configure() { 
    bindConstant().annotatedWith(ConfigurationAnnotation.class) 
     .to(configuration.getString("configurationValue"));  
} 

Commons Configuration이 지원하는 구성을 다시로드하는 것은 Guice 삽입에 매우 쉽게 구현됩니다.

@Override public void configure() { 
    bind(String.class).annotatedWith(ConfigurationAnnotation.class) 
     .toProvider(new Provider<String>() { 
      public String get() { 
       return configuration.getString("configurationValue"); 
      } 
    });  
} 
3

받는다는 중앙에 사용할 수 Guice configuration을 시도해보십시오 또한

@Configuration("configs.qty.things") 
private int numberOfThings = 10; 

당신은 시작에 좋은 구성 보고서를 얻을 것이다 : 당신 구성 매개 변수가 사용되는 경우 코드에서 그것을 볼 수 있습니다 속성, HOCON 및 JSON 형식.

@BindConfig(value = "application") 
public class Service { 

    @InjectConfig 
    private int port; 

    @InjectConfig 
    private String url; 

    @InjectConfig 
    private Optional<Integer> timeout; 

    @InjectConfig("services") 
    private ServiceConfiguration services; 
} 

당신은

public class GuiceModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     install(ConfigurationModule.create()); 
     requestInjection(Service.class); 
    } 
}