sthemeli:
私は複数のバックエンドを使用してREST APIプロジェクト(別のjarファイルにパッケージを)持っています。私は、設定されるバックエンドを定義するためにJavaの設定クラスに@ConditionalOnPropertyを使用しています。のは、リレーショナルデータベースとMongoDBの春データのバックエンドジャーとバックエンドがあるとしましょう。プロジェクトは、MySQLデータベースと環境に展開されている場合は、最初のバックエンドを使用する必要があります。プロジェクトは、事前に構築されなければならないとapplication.propertiesファイル内の唯一のプロパティは、展開前に変更されます。
条件付きで、それぞれのリポジトリをautowireする方法はありますか?たとえば、春のサービスクラスで私のような何かを持っています。
@Service
public class MyService {
@Autowired
private UserMySqlRepository repo1;
@Autowired
private UserMongoDBRepository repo2;
}
UserMySqlRepositoryはJpaRepositoryを拡張し、UserMongoDBRepositoryはMongoDbRepositoryを拡張します。それは@Conditionalと、これらのフィールドに注釈を付けると、それぞれの構成が使用されている場合にのみ、それらをautowireすることは可能ですか?ない場合は、これを行うための最善の方法はありますか?
ビナイプラジャーパティ:
はい!あなたは、戦略デザインパターンを実装することができます。戻り値の型が同じままであるように、あなたのリポジトリクラスが共通のインターフェースを持っていることを確認します。お使いの設定ファイルでデータベースを構成し、それに応じてオブジェクトを返すされているかをチェックするようなBeanメソッドを定義します。
interface UserRepository {
//...
}
interface UserMySqlRepository extends UserRepository {
//...
}
interface UserMongoDBRepository extends UserRepository {
//...
}
@Configuration
class DbBeansConfig{
@Bean
public UserRepository getUserRepository(){
if(mysql configured){// give your impl here
return new UserMySqlRepository(); // your bean here
}else{
return new UserMongoDBRepository (); // your bean here
}
}
}