これまでのところ、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);
}
...
}
どんな助けでも大歓迎です。
乾杯、スコット。