9

多くの専門家がアノテーション駆動型の依存性注入に切り替えない主な理由は、開発/テスト/本番環境間の切り替えをサポートしていないためだと思います。多くの場合、開発目的では、さまざまなサービス(およびそれらの接続)を使用するだけでなく、それらをモックしたり、ダミーインスタンスを作成したりする必要があります。

昨日、Springアノテーションを使用した1つの解決策を見つけました。

    @Value("#{${env} == "production" ? realService : dummyService}")
    private SomeService service;

...これは機能するはずですが、良くありません。

私はあなたの解決策や議論に非常に興味があります:なぜそれが本当の問題ではないのですか;-) Guice、Spring、または他のものは大歓迎です。

元の問題はこのスレッドの一部でした:Spring @Autowiredの使用法ですが、新しいスレッドを作成する価値があると思いました。

4

2 に答える 2

12

残念ながら、Guice についてコメントすることはできませんが、コメントに記載されているように、Spring 3.1 以降を使用している場合は、実際に Spring プロファイルを使用できます。

プロファイルを使用した Java ベースの構成は次のようになります。

@Configuration
@Profile("production")
public class ProductionConfig {
    @Bean 
    public SomeService someService() { ... }
}

@Configuration
@Profile("dev")
public class DevelopmentConfig {
    @Bean 
    public SomeService someService() { ... }
}

その後、消費クラスは再び単純になります。

...
@Autowired
private SomeService someService;
...

目的のプロファイルは、他の方法の中でも特に、システム プロパティを介してアクティブ化できます。

-Dspring.profiles.active="production"

これは、異なる環境でアプリケーションを実行するときに役立ちます。

個人的には、Spring プロファイルにまったく依存しないようにしています。代わりに、実行時にアプリケーションに渡される外部プロパティ ファイルに環境の違いをカプセル化しようとします。このアプローチはこれまでのところうまくいきましたが、ymmv.

于 2012-11-21T13:38:03.590 に答える
-1

@Value注釈は、あなたが試した方法では機能しません。文字列の形式でのみ値を提供できます。達成したいことについては、@ShyJ の提案に従って Spring Profiles を試すことができます。

これがお役に立てば幸いです。乾杯。

于 2012-11-21T13:25:05.437 に答える