2016-09-15 11 views
3

工場が使用されている次のシナリオでGoogle-Guiceを使用して自動配線する方法を説明してください.XSLT処理にXMLファクトリを使用しています。Google Guiceの工場向けオートワイヤリング

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

私はカスタムURI resolver.Alsoを必要とし、自動ワイヤトランスの工場へのコードのこの作品は、リクエストを受信し続けると、その後it.Butを処理するAPIの一部であり、それはnewTransformerを(呼び出す必要がありましたら)それが受け取るすべての要求に対して。

+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リゾルバと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つだけアプリケーション全体で使用されます。

別の方法としては、同様にそれら2つのオプションのいずれかを行うことができます。

  1. バインドあなたのモジュール内の変圧器を。基本的にすべての作成コードをguiceのモジュールに入れ、作成したTransformerをシングルトンとしてバインドします。

  2. プロバイダメソッドを作成します。これはGuiceモジュールの注釈付きメソッドで、トランスフォーマが返されます。

これらのすべてが本質的に同じ問題を解決します。XMLTransformerのインスタンスをアプリケーションで準備して注入します。私はそれはあなたが探しているものだ願ってい

アルトゥル

+0

遅く応答して申し訳ありません。これはうまくいきました..uriresolverとxsltの位置が異なる複数の変圧器のインスタンスが必要な場合 –

+0

この場合、補助注入を使用して、作成前に工場と場所を指定します。これらの値に基づいてトランスをキャッシュすることができますので、何度も何度も作成する必要はありません。アシスト注入については、https://github.com/google/guice/wiki/AssistedInjectをご覧ください。 – pandaadb

関連する問題