0

これまでのところ、Spring Boot Maven プロジェクト (pom を除く) の xml ファイルの開発を回避することができました。それらはすべてコンパイル時に生成されます。ここで指定されているように、実行コマンド内でプロファイルを定義することでこの方法を維持したいと考えていました。 .

@ ComponentScanメイン クラスを使用してコンポーネントのスキャンを有効にし、DAO を @ Repositoryとしてタグ付けするだけで、UserDAOmySQLImpl クラス (UserDAO を継承) を自動配線することに成功しました。

    @Autowired
    private UserDAO userDAO;

次に、Live で db8 実装を使用する場合に備えて、2 つ目の DAO を追加することを楽しみにしています。どの UserDAO 実装を使用する必要があるかをアプリケーションが判断する必要があります。プロフィールが答えのようでした。

いくつか読んだ後、ほとんどの場合、これらのプロファイルとコンポーネントを管理するために、ある種の構成クラスと外部 xml を追加する必要があるように見えましたが、これは面倒なようで、不要であることを願っています。

私は2つの実装で次のようにタグ付けしました:

@Repository
@Profile("dev")
public class UserDAOmySQLImpl implements UserDAO {...

-

@Repository
@Profile("dev")
public class UserDAOdb8Impl implements UserDAO {...

そして、ここで指定されているように、Maven の目標を介してアクティブなプロファイルを設定します。これは、開発スクリプトとライブ ビルド スクリプトのそれぞれの目標内でアクティブなプロファイルを指定できるように、これが適切でクリーンなソリューションになることを願っています。

私の現在のテストの目標は次のとおりです。

  spring-boot:run -Drun.profiles=dev

ただし、ビルド時に、両方の Bean が取得されているというエラーが表示されます。

 *No qualifying bean of type [com.***.studyplanner.integration.UserDAO] is defined: expected single matching bean but found 2: userDAOdb8Impl,userDAOmySQLImpl*

質問

  • Maven ゴールに設定されたプロファイルは、@Profile タグを使用するときにチェックされるプロファイルですか?

  • プロファイルが適切に設定されていない場合、どちらの実装も選択されるべきではないのに、Spring が両方の実装を選択するのはなぜですか?

  • 私が探しているものを達成するためのきれいな方法に関する提案はありますか?

ボーナス

これを複製するのに苦労していますが、使用するプロファイルを決定するために環境ファイルが存在するかどうかを簡単に確認するのは簡単なので、アプリ内でプロファイルを設定したいと思います ( Spring Profiles Examplesにあります)。

public static void main(String[] args) {

      AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
      //Enable a "live" profile
      context.getEnvironment().setActiveProfiles("live");
      context.register(AppConfig.class);
      context.refresh();        
      ((ConfigurableApplicationContext) context).close();
    }

私が取り組んでいるアプリケーションの異常なメインクラスに、いじるのをためらっています。

 public class StudyPlannerApplication {
     ...
     public static void main(String[] args) {
            SpringApplication.run(StudyPlannerApplication.class, args);
         }
     ...
 }

どんな助けでも大歓迎です。

乾杯、スコット。

4

1 に答える 1

1

愚かな私、質問を読んでいる証拠は、コピーと貼り付けのジョブが正しくないということは、両方の DAO 実装で @profile が「Dev」に設定されていることを意味することに気付きました。db8 DAO を @Profile("live") に変更した後、上記は正常に動作します。

そのため、プロファイルに基づいてリポジトリを選択することは、maven と spring boot を使用する場合、実際には非常に簡単です。

1) メインクラスに @ComponentScan アノテーションがあることを確認します

@ComponentScan
public class StudyPlannerApplication {

2) コンポーネントに @Profile タグを付けて、セクション化するプロファイルに従ってタグ付けします。

@Repository
@Profile("dev")
public class UserDAOdb8Impl implements UserDAO {...

-

@Repository
@Profile("live")
public class UserDAOdb8Impl implements UserDAO {...

3) Maven の目標とともにプロファイルを送信します

spring-boot:run -Drun.profiles=dev

ウェブ上の他の場所で行ったように自動配線プロファイルを使用した完全な例を見たことがないので、これが他の人に役立つことを願っています

于 2016-03-29T13:37:56.150 に答える