私はいくつかの独立したBean Xを持つプロジェクトを持っています。これは一連のサービスにautowiredされています。サービスは相互に使用され、最終的にはシングルエントリーポイント(コントローラ)で使用されます。今や新しい要件があります:Xのいくつかのバージョンを実装し、エントリポイントのパラメータ(enum XType)に従って使用することを決定します。サービスを変更することなくそれを行うことはいいですね。Springでの暗黙的なautowiring
解決策私の考えは、カスタムスコープUsesXを作成してBeanFactoryPostProcessor
を実装して、UsesXで各BeanDefinition
を各XTypeのシングルトンのセットに変換することです。また、このBeanに修飾子を追加することで、Xのファクトリメソッドとコントローラのパラメータベースの選択を行うことができます。しかし、この修飾子をクラスを変更せずに暗黙的にサービス内の@Autowired
に追加する方法はありますか?
UPD
[OK]を、例では、私はA
が要求されたとき、DBのURL "jdbc:mysql://Adb"
を使用したい、とB
"jdbc:mysql://Bdb"
:また
enum DatabaseType {A, B}
@Controller
@RequestMapping(/)
class MyController {
@Autowired ServiceProvider provider; // some way to get service by DatabaseType
void foo(@RequestParam DatabaseType dbType) {
ServiceA a = provider.getA(dbType);
a.bar();
ServiceB b = provider.getB(dbType);
b.baz();
}
}
@Service
class ServiceA {
// Don't want to get information about different databases in services
@Autowired ServiceB b;
@Autowired ServiceC c;
@Autowired DaoFoo dao;
//...
}
@Service
class ServiceB {
@Autowired ServiceC c;
@Autowired DaoFoo daoFoo;
@Autowired DaoBar daoBar;
//...
}
@Service
class ServiceC {
@Autowired DaoBar daoBar;
//...
}
@Repository
class DaoFoo {
DaoFoo(String dbURL) {/*...*/}
}
@Repository
class DaoBar {
DaoFoo(String dbURL) {/*...*/}
}
が、それは"jdbc:mysql://Adb"
に必要とされ"jdbc:mysql://Bdb"
がで設定されXML構成。
非常に不明確予選注釈の追加の使用を検索します。 ServiceAはAdbを使用し、ServiceBはBdbを使用すると仮定していますか?それでもなおこの質問は0感覚 – Snickers3192