我有一個獨立的bean X的項目,這是在一堆服務中自動裝配的。服務被相互使用,並最終用於單個入口點(控制器)。現在有了新的要求:實現X的多個版本,並根據入口點的參數(枚舉XType)決定使用哪一個版本。在不改變服務的情況下做到這一點很好。在春天隱式合格的自動裝配
我對解決方案的想法是創建自定義範圍UsesX並實現BeanFactoryPostProcessor
,這將使用UsesX將每個BeanDefinition
轉換爲每個XType的單例集。此外,它還會爲此Bean添加限定符,以便爲控制器中的X和基於參數的選擇創建工廠方法。但是,如何在隱含的情況下將此限定符添加到服務@Autowired
中,而無需更改它們的類?
UPD
好,例如,我想用分貝URL "jdbc:mysql://Adb"
時A
要求,而當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?即使這樣,這個問題仍然有意義 – Snickers3192