Tôi có một dự án với một số độc lập đậu X, đó là autowired trong một loạt các dịch vụ. Các dịch vụ được sử dụng bởi nhau và cuối cùng được sử dụng trong một điểm vào (bộ điều khiển). Bây giờ có yêu cầu mới: thực hiện một số phiên bản của X, và quyết định một phù thủy là sử dụng theo tham số của điểm nhập cảnh (enum XType). Nó sẽ được tốt đẹp để làm điều đó mà không thay đổi dịch vụ.Autowiring hoàn toàn đủ điều kiện trong mùa xuân
Ý tưởng giải pháp của tôi là tạo ra phạm vi tùy chỉnh UsesX và triển khai BeanFactoryPostProcessor
, điều này sẽ chuyển đổi mỗi BeanDefinition
bằng UsesX thành bộ đơn cho mỗi XType. Ngoài ra, nó sẽ bổ sung thêm vòng loại cho hạt cà phê này, để làm cho nó có thể làm cho phương pháp nhà máy cho X và lựa chọn dựa trên tham số trong bộ điều khiển. Nhưng làm thế nào để thêm vòng loại này vào @Autowired
trong các dịch vụ ngầm, mà không thay đổi các lớp học của họ?
UPD
Ok, Ví dụ, tôi muốn sử dụng db url "jdbc:mysql://Adb"
khi A
yêu cầu, và "jdbc:mysql://Bdb"
khi B
:
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) {/*...*/}
}
Ngoài ra, nó là cần thiết để "jdbc:mysql://Adb"
và "jdbc:mysql://Bdb"
được cấu hình trong Cấu hình XML.
Rất rõ ràng những gì đang được hỏi. Là ServiceA giả sử sử dụng Adb và ServiceB giả sử sử dụng Bdb ?? Thậm chí sau đó câu hỏi này vẫn làm cho ý nghĩa 0 – Snickers3192