问题描述
我的问题是要找到实现Bean Switcher的最佳技术,以管理具有不同持久层的不同站点。
我设计了用于客户管理和电子商务服务的服务器。
对于每项服务,我都使用API层,Controller层和持久层。
此服务器正在为不同的客户端管理多个站点。 直到今天,我所有的站点都对所有站点使用了相同的持久层。
最近,我对从外部服务器集成客户服务提出了新要求-换句话说,与外部服务集成。
我正在尝试通过添加另一个使用外部服务的API的持久层来解决此问题,并且当我从该站点收到请求时,将持久层切换到外部服务(例如工厂)。
让我们假设我有关于请求来源站点的详细信息。 我的目标是根据我从请求中提取的参数,使用一种“工厂”在持久层之间进行切换。
如何使用Spring MVC工具动态切换接口的实现类?
我找到了以下解决方案:https://www.baeldung.com/spring-dynamic-autowire,但我认为这不是最好的解决方案。
任何人都可以分享其他技术来实现我的目标吗?
非常感谢您的帮助!
Asaf
解决方法
您可以使用Factory模式来解决此问题。
您可以定义一个类,该类将自动连接所有类型的数据服务。您应该首先通过类似这样的接口定义一个抽象。
interface SomeDao {
...
}
@Service(name="someDaoMysql")
class SomeDaoMysqlImpl implements SomeDao {
...
}
@Service(name="someDaoApi")
class SomeDaoApiImpl implement SomeDao {
...
}
一旦您拥有SomeDao
接口的这些不同变体,请根据一些参数返回其中之一。工厂界面可能看起来像这样。
enum DaoType{
API,MYSQL;
}
interface SomeDaoFactory {
SomeDao getDao( DaoType type);
}
@Component
class SomeDaoFactoryImpl implements SomeDaoFactory{
@Aurowired @Qualifier("someDaoMysql") SomeDao someDaoMysql;
@Aurowired @Qualifier("someDaoApi") SomeDao someDaoApi;
public SomeDao getDao( DaoType type){
switch(type){
case API:
return someDaoApi;
case MYSQL:
return someDaoMysql;
default:
throw new IllegalStateExecption("Unknown type"+type);
}
}
用法
@Service
public class SomeFancyServiceImpl implements SomeFancyService{
@Autowired SomeDaoFactory someDaoFactory;
@Override
public void doSomething(){
SomeDao dao = someDaoFactory.getDao( API );
// do something with dao
}
}