2009-04-19 4 views
12

私はGoogle Guice as DI frameworkをチェックしていますが、私はちょっと困惑しています。なぜ設定ファイルがないのですか?Google Guiceの依存関係注入のための設定ファイルがないのはなぜですか?

this questionの部分的な説明がありましたが、構成ファイルなしでコンポーネントの役割(またはスイッチを使用する必要があるその他のもの)をどのように設定することができるかはまだ分かりません。

答えて

28

設定は、多くのシナリオで有効な決定である設定ファイルではなく、コード内にあります。

これは、アプリケーションの配管方法を変更したい場合は、モジュールを再構築する必要があることを意味します。もちろん、コマンドライン引数、プロパティファイルあなたがしたい場合など。

定期的にアプリケーション配管を変更する必要があり、1つのファイル以外のものを再配備したくない場合は、Guiceがあなたのためではないかもしれません。一方、DIを使用する主な理由は、コードをより明確にすることであり、実際には同じ配管を使用する(または十分に近い)場合、Guiceは良いオプションです。必要なロジックがたくさんありますとにかく配管を整理するときに使用するコンポーネントと、宣言的に記述/構築するのが一般的に難しいコンポーネントです。

さまざまなDIフレームワークは、さまざまな利点とトレードオフを備えています。アプリケーションに最も適したものを使用します。

4

Guiceの多くの設定は@Injectアノテーションを介して暗黙的に行われます。プロジェクトの複雑さの大部分は、多数のプロジェクト成果物からもたらされます。 Javaファイル、XMLファイル、プロパティファイル、データベース、パラメータ.. Guiceは設定ファイルを使用しないことでこの複雑さの一部を取り除こうとします。

コンパイル時にアプリケーションを再配線するのは簡単です。ほとんどの場合、モジュールクラスを編集するだけです。 Guiceが提供するほとんどのクラスでは、設定は必要ありませんが、@Injectは適切な場所にあります。同じインターフェースの2つの異なる実装がある場合は何も設定する必要はありません。 Providerクラスを使用する外部ライブラリ。

5

ほとんどのDI構成は、ある配置から別の配置まで同じであるため、Guiceの構成を非常に簡潔にするコードを使用して構成でき、コンパイル時の型チェック、リファクタリングツール、コードナビゲーションなど

データベースのユーザー名とパスワードの構成など、デプロイメントから変更する場合は、必要なコードを自分で記述することができます。設定ファイル(おそらくプロパティファイル)を読み込み、パラメータを解析し、Guiceモジュールにバインドして、アプリケーションがアクセスできるようにするコードを書いてください。これを行うために必要なコードは、多くのコード行を必要としません。

1

ファイルの意味は不明ですが、GuiceではBinderとカスタムProvidersを使って実装を変更することができます。

+1

うん - 私は何を意味する動作を変更する唯一の方法は全部 – JohnIdol

7

このように設定した場合、設定ファイルを使用してブーストラッピングを導入するのは簡単です。 Guiceは、実際にパラメータ化する必要のあるプロパティファイルをロードする単純なAPIとともに使用します。これは@Namedアノテーションと一緒に使用することができます。もちろん、いくつかの条件をモジュールに含めることもできます(ただし、それを上回らないようにすることをお勧めします)。設定は、私たちのプロパティファイルと、そのようなを読み込むものです

public class MetModules extends AbstractModule { 

    private static final Logger log = LoggerFactory.getLogger(MetModules.class); 

    private final Settings settings; 

    public MetModules(Settings settings) { 
     this.settings = settings; 
    } 

    @Override 
    protected void configure() { 

     // common (stage independent modules) go here 
     install(new CommandsModule()); 
     install(new ServletsModule()); 
     install(new DataBaseModule(settings)); 
     install(new JobsModule(settings)); 

     // any development/ production specific modules 
     Stage stage = currentStage(); 
     if (Stage.DEVELOPMENT.equals(stage)) { 
      configureForDevelopment(); 
     } else { // PRODUCTION 
      configureForProduction(); 
     } 
    } 

    /** 
    * Install modules that will be used in development. 
    */ 
    private void configureForDevelopment() { 

     // Mock implementation of email delivery that just logs it got a 
     // message rather than trying to send it. 
     install(new AbstractModule() { 
      @Override 
      protected void configure() { 
       bind(Delivery.class).toInstance(new Delivery() { 

        public String deliver(MailMessageExchange exchange) 
          throws DeliveryException { 
         log.info("email message: " 
           + exchange.getMessage().getMailMessage() 
           + " to " 
           + Arrays.asList(exchange.getMessage() 
             .getMailMessage().getTo()) 
           + " (not sent)"); 
         return "fooMessageId"; 
        } 
       }); 
      } 
     }); 

     // local in-memory registry suffices 
     install(new LocalServiceRegistryModule()); 

     // local in memory db implementations of services 
     install(new LocalServicesModule()); 
    } 

    /** 
    * Install modules that will be used in production. 
    */ 
    private void configureForProduction() { 
     // we really only need this (error interception and audit logging) 
     // in production 
     install(new AopModule()); 
     install(new ZooKeeperServiceRegistryModule());  } 
} 

この

は、私たちのブートストラップの一部が設定されている方法の例です。今のところ特定の設定と一緒に開発/生産を展開するために、特定の優先されます私たちのために仕事をするようだが、我々は明らかにしたい場合は、私たちはこれをさらに行くことができます。

1

私は最近、次のプロジェクトを作成しました。

http://code.google.com/p/guice-property-injector/

それはWIPですが、環境に応じてプロパティファイルからプロパティの実行時の注入を可能にします。

+0

が面白そう再構築することであるということです - THX – JohnIdol

関連する問題