なぜGoogleのGuiceのと依存性注入のために全く設定ファイルはありませんか?

StackOverflow https://stackoverflow.com/questions/765680

質問

私はDIフレームワークのとしてGoogle Guiceのnoreferrer"> この質問を見つけたがそれは私が私のコンポーネントの役割を設定することができるだろうか、まだ明らかになっていない(またはいずれかの他の事は、私はスイッチを使用する必要があります)設定ファイルなします。

すべてのヘルプは感謝!

役に立ちましたか?

解決

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

あなたのアプリケーションの配管の別の方法を解放したい場合は、

はい、それはあなたが(ちょうどモジュールおそらく)再構築する必要があることを意味します - あなたはまだコマンドライン引数からいくつかの設定値を得ることができ、もちろんものの、プロパティファイルなどあなたがしたい場合。

あなたが定期的にあなたのアプリケーションの配管を変更する必要があり、単一のファイル以外のものを再デプロイしたくない場合は、

、Guiceのはあなたのためではないかもしれません。一方、DIを使用するためのあなたの主な理由は、あなたのコードをより明確にするために、生産にあなたがいつも本当に同じ配管(または十分に近い)を使用しますであれば、Guiceには良いオプションです - あなたが望むロジックのビットがあることが多いですとにかく配管を整理するときに使用すると、一般的に困難な部品が記述するために/宣言構築ます。

別のDIフレームワークは異なる利点とトレードオフがある - 。1アプリケーションに最も適した方を使用する

他のヒント

あなたがそう傾斜している場合は、設定ファイルを使用してブートストラップを導入することは簡単です。私たちは、物事は本当にパラメータ化する必要があることを行ってプロパティファイルをロードするシンプルなAPIと一緒にGuiceのを使用しています。 (それは良いアイデアですが、それを、やる以上にない)これは@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());      }
}

設定は私達のプロパティファイルと、そのようなを読み込むものですどこ。今のところ特定の設定と一緒に開発/生産を展開するために、特定の優先されます私たちのために仕事をするようだが、我々は明らかにしたい場合は、私たちはこれをさらに行くことができます。

DIの設定のほとんどは別の展開から同じになるので、彼らは非常によくGuiceのの設定は非常に簡潔になり、あなたはコンパイル時の型チェックの利点を得るコード、リファクタリングツール、コードのナビゲーションを使用して設定することができますなど。

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

Guiceの中の設定の多くは@Inject注釈を経由して、暗黙的です。プロジェクトにおける複雑さの多大プロジェクト成果物の大多数から来ています。 Javaファイル、XMLファイル、プロパティファイル、データベース、パラメータ... Guiceのは、設定ファイルを使用していないことで、この複雑さの一部を除去しようとします。

あなたのアプリケーションを再配線すると、コンパイル時には簡単です。ほとんどの場合、あなたは、あなたのモジュールクラスを編集する必要があります。 Guiceのでhandeledほとんどのクラスでは、あなたは正しい場所には全く設定を必要としないが、唯一の@Injectます - あなたは、同じインターフェイスの二つの異なる実装を持っているときにのみ、何も設定する必要があります - またはあなたがからクラスを注入したいときプロバイダクラスを使用して外部ライブラリます。

ファイルによって何を意味するかを確認しますが、Guiceのは、あなたが経由implementaionsを変更できない<のhref =「http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Binder.html」 rel = "nofollowをnoreferrer">バインダーとカスタム<のhref = "http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Provider.html" のrel =」 noreferrer nofollowを ">プロバイダがします。

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

http://code.google.com/p/guice-property-インジェクター/

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top