Spring MVC-如何动态切换实现类?

问题描述

我的问题是要找到实现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
     }
}