紫鷗 發表於 2024-3-14 10:40:22

在SpringBoot中实现适配器模式的两种方式

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1. 场景</li><li>2. 方式1,通过实现类定义类型字段实现</li><ul class="second_class_ul"><li>2.1 创建接口</li><li>2.2 创建mysql实现类</li><li>2.3 创建oracle实现类</li><li>2.4 创建接口,在接口中注入service集合,根据每个实现类中定义的dbType进行匹配后进行调用</li><li>2.5 测试,浏览器输入</li></ul><li>3. 方式2,以动态service名称的方式实现</li><ul class="second_class_ul"><li>3.1 创建接口</li><li>3.2 创建创建mysql实现类,定义实现类名称为mysqlDbService</li><li>3.3 创建创建oracle实现类,定义实现类名称为oracleDbService</li><li>3.4 引入ApplicationContext,获取service方法名</li><li>3.5 调用接口,通过ApplicationContextHelper根据service名称动态获取实现类,调用方法</li><li>3.6 测试</li></ul></ul></div><p class="maodian"></p><h2>1. 场景</h2>
<blockquote><p>当我们后台有两个数据库,分别为mysql和oracle,根据前端参数中的数据库类型字段,去查询对应sql语句</p></blockquote>
<p class="maodian"></p><h2>2. 方式1,通过实现类定义类型字段实现</h2>
<p class="maodian"></p><h3>2.1 创建接口</h3>
<div class="jb51code"><pre class="brush:java;">public interface DbService {

    /**
   * 获取数据库类型
   * @return
   */
    String getDbType();

    /**
   * 查询数据库sql
   * @return
   */
    String getDbSql();
}
</pre></div>
<p class="maodian"></p><h3>2.2 创建mysql实现类</h3>
<div class="jb51code"><pre class="brush:java;">@Service
public class MysqlDbService implements DbService{

    @Override
    public String getDbType() {
      return "mysql";
    }

    @Override
    public String getDbSql() {
      return "获取mysql的SQL";
    }
}
</pre></div>
<p class="maodian"></p><h3>2.3 创建oracle实现类</h3>
<div class="jb51code"><pre class="brush:java;">@Service
public class OracleSDbService implements DbService{

    @Override
    public String getDbType() {
      return "oracle";
    }

    @Override
    public String getDbSql() {
      return "获取oracle的SQL";
    }
}
</pre></div>
<p class="maodian"></p><h3>2.4 创建接口,在接口中注入service集合,根据每个实现类中定义的dbType进行匹配后进行调用</h3>
<div class="jb51code"><pre class="brush:java;">@RestController
@RequestMapping("/test")
public class TestController {

    @Resource
    private List&lt;DbService&gt; dbServiceList;

    @GetMapping("/getDbSql1")
    public String getDbSql(@RequestParam String dbtype){
      DbService dbService = dbServiceList.stream().filter(item -&gt; dbtype.equals(item.getDbType())).findFirst().get();
      return dbService.getDbSql();
    }

}
</pre></div>
<p class="maodian"></p><h3>2.5 测试,浏览器输入</h3>
<p style="text-align:center"><img alt="在这里插入图片描述" src="https://img.jbzj.com/file_images/article/202403/2024031410394417.png" /></p>
<p class="maodian"></p><h2>3. 方式2,以动态service名称的方式实现</h2>
<p class="maodian"></p><h3>3.1 创建接口</h3>
<div class="jb51code"><pre class="brush:java;">public interface DbService {

    /**
   * 获取数据库类型
   * @return
   */
    String getDbType();

    /**
   * 查询数据库sql
   * @return
   */
    String getDbSql();
}
</pre></div>
<p class="maodian"></p><h3>3.2 创建创建mysql实现类,定义实现类名称为mysqlDbService</h3>
<div class="jb51code"><pre class="brush:java;">@Service(value = "mysqlDbService")
public class MysqlDbService implements DbService{

    @Override
    public String getDbType() {
      return "mysql";
    }

    @Override
    public String getDbSql() {
      return "获取mysql的SQL";
    }
}
</pre></div>
<p class="maodian"></p><h3>3.3 创建创建oracle实现类,定义实现类名称为oracleDbService</h3>
<div class="jb51code"><pre class="brush:java;">@Service(value = "oracleDbService")
public class OracleSDbService implements DbService{

    @Override
    public String getDbType() {
      return "oracle";
    }

    @Override
    public String getDbSql() {
      return "获取oracle的SQL";
    }
}
</pre></div>
<p class="maodian"></p><h3>3.4 引入ApplicationContext,获取service方法名</h3>
<div class="jb51code"><pre class="brush:java;">@Component("applicationContextHelper")
public class ApplicationContextHelper implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public static &lt;T&gt; T popBean(String name, Class&lt;T&gt; clazz) {
      if (applicationContext == null) {
            return null;
      }
      return applicationContext.getBean(name, clazz);
    }

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
      applicationContext = context;
    }

    public ApplicationContext getInstance() {
      return applicationContext;
    }
}
</pre></div>
<p class="maodian"></p><h3>3.5 调用接口,通过ApplicationContextHelper根据service名称动态获取实现类,调用方法</h3>
<div class="jb51code"><pre class="brush:java;">@RestController
@RequestMapping("/test")
public class TestController {

    @Resource
    private List&lt;DbService&gt; dbServiceList;

    @GetMapping("/getDbSql2")
    public String getDbSql2(@RequestParam String dbtype){
      DbService dbService = ApplicationContextHelper.popBean(dbtype + "DbService", DbService.class);
      return dbService.getDbSql();
    }
}
</pre></div>
<p class="maodian"></p><h3>3.6 测试</h3>
<p style="text-align:center"><img alt="在这里插入图片描述" src="https://img.jbzj.com/file_images/article/202403/2024031410394518.png" /></p>
<p>到此这篇关于在SpringBoot中实现适配器模式的两种方式的文章就介绍到这了,更多相关SpringBoot适配器模式内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>SpringBoot&nbsp;策略模式实现切换上传文件模式</li><li>SpringBoot 模板模式实现优惠券逻辑的示例代码</li><li>详解rabbitmq使用springboot实现fanout模式</li><li>SpringBoot使用责任链模式优化业务逻辑中的if-else代码</li><li>快速掌握Java中注解与反射</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 在SpringBoot中实现适配器模式的两种方式