2016-09-15 3 views
3

공장이 사용되는 다음 시나리오에서 Google-Guice를 사용하여 자동 배선하는 올바른 방법을 설명하십시오. XSLT 처리를 위해 XML 팩토리를 사용 중입니다.공장을위한 Google Guice Autowiring

StringWriter strWriter = new StringWriter(); 
System.setProperty("javax.xml.transform.TransformerFactory", 
       "net.sf.saxon.TransformerFactoryImpl"); 
TransformerFactory xmlTransformerFactory = TransformerFactory.newInstance(); 
CustomUriResolver out = new CustomUriResolver(new HashMap<String, StringWriter>()); 
xmlTransformerFactory.setAttribute("http://saxon.sf.net/feature/outputURIResolver", out); 
Transformer xmlTransfomer = xmlTransformerFactory.newTransformer(new StreamSource("src/main/resources/test.xslt")); 
xmlTransfomer.transform(new StreamSource(new StringReader(xml)), new StreamResult(strWriter)); 
System.out.println(out.getResults().size()); 
for(Map.Entry resultEntry : out.getResults().entrySet()){ 
    System.out.println(resultEntry.getValue()); 
}; 

나는) (이 코드 조각이 요청을 받아 유지하고 newTransformer를 호출하는 다음 해하지을 처리 할 API의 일부 사용자 정의 URI resolver.Also을 필요로 자동 와이어 변압기 공장에이 있으시면 수신하는 모든 요청에 ​​대해

+0

새 변압기 각 시간이 필요하거나 변압기 응용 프로그램 전반에 걸쳐 싱글로 guice를 통해 사용할 수있게하려면합니까? – pandaadb

+0

싱글 톤으로 필요합니다 .. 모든 요청에 ​​동일한 인스턴스를 사용할 수 있습니다 –

답변

1

이 작업을 수행하는 방법은 Guice가 사용자의 종속성을 처리하도록하는 것입니다. 의존성을 만드는 방법은 당신에게 달려 있습니다. guice는 상관 없습니다 (guice가 당신을 위해 의존성을 만들어야하는 곳에서 요격기를 사용해야 만하지 않는 한).

이 경우에는 공급자를 사용하여 종속성을 주입합니다. 당신은 모든 생성 로직을 추출해야하므로, 트랜스포머를 저장하고 모든 곳에서 트랜스포머를 삽입하기 위해 한번 실행되도록해야합니다. 공급자를 사용하는 이유는 더 많은 의존성을 주입 할 수 있기 때문입니다. .

public class TransformerProvider implements Provider<Transformer> { 

     @Inject 
     @Named("output.uri.resolver") 
     String outputUriResolver; 

     @Inject 
     @Named("xslt.location") 
     String xsltLocation; 

     Transformer instance = null; 

     @Override 
     public Transformer get() { 
      if(instance == null) { 
       try { 
        instance = create(); 
       } catch (TransformerConfigurationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      return instance; 
     } 

     private Transformer create() throws TransformerConfigurationException { 
      System.setProperty("javax.xml.transform.TransformerFactory", 
          "net.sf.saxon.TransformerFactoryImpl"); 
      TransformerFactory xmlTransformerFactory = TransformerFactory.newInstance(); 
      CustomUriResolver out = new CustomUriResolver(new HashMap<String, StringWriter>()); 
      xmlTransformerFactory.setAttribute(outputUriResolver, out); 
      return xmlTransformerFactory.newTransformer(new StreamSource(xsltLocation)); 
     } 
    } 

: 내가 믿는 제공 등의 방법을) 주석에 의해 같은

이 예제를 참조하십시오 이 클래스는 Transformer의 공급자 역할을합니다. 처음으로 필요하면 인스턴스를 시작하고 인스턴스를 저장합니다. 또는 생성자에서 생성 할 수도 있습니다.

나는 2 개의 일반적인 속성 (uri resolver와 xslt의 위치)을 주입 중이다. 후자의 경우 응용 프로그램을 테스트하는 것이 더 쉽습니다 (다른 xslt를 테스트하여 공급자에게 주입하는 것).

은 그럼 내가 Guice 그것에 대해 알 수 있도록 모든 모듈에 결합 할 필요가 그것을 사용할 수 있습니다 : 나는 싱글에 그 공급자 유형을 결합하고

Injector i = Guice.createInjector(new AbstractModule() { 
      @Override 
      protected void configure() { 
       bind(Transformer.class).toProvider(TransformerProvider.class).in(Singleton.class); // bind factory 
      } 
     }); 

. 즉, 해당 공급 업체의 인스턴스가 애플리케이션 전체에서 단 1 개만 사용됩니다.

또는 당신은뿐만 아니라 그 두 가지 옵션 중 하나를 수행 할 수

  1. 바인딩 모듈의 변압기를. 기본적으로 모든 생성 코드를 guice의 모듈에 넣은 다음 생성 된 Transformer를 싱글 톤으로 바인딩합니다.

  2. 공급자 메서드를 만듭니다. 이것은 Guice Module에서 사용자를 위해 Transformer를 반환하는 주석이 달린 메소드 일뿐입니다.

이들 모두는 본질적으로 동일한 문제를 해결합니다. 응용 프로그램에서 XMLTransformer의 인스턴스를 준비하여 주입하십시오. 나는 그 당신이 찾고있는 무슨 희망

,

아르투르

+0

늦게 응답 해 주셔서 죄송합니다.uriresolver와 xslt 위치가 다른 변압기가 하나 이상 필요하면 어떻게합니까? –

+0

이 경우 보조 주입을 사용하여 작성하기 전에 위치와 해결자를 공장에 제공해야합니다. 그런 다음 값을 기반으로하여 변압기를 캐싱 할 수 있으므로 반복해서 만들 필요가 없습니다. 다음 페이지에서 보조 주사에 대해 읽을 수 있습니다. https://github.com/google/guice/wiki/AssistedInject – pandaadb