iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用spring动态获取接口的不同实现类
  • 829
分享到

使用spring动态获取接口的不同实现类

2024-04-02 19:04:59 829人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录spring动态获取接口的不同实现类当时想到了两种解决办法获取某接口所有实现类正文结果spring动态获取接口的不同实现类 最近做项目,有个需求是和外部对接,从接口获取新闻数据,

spring动态获取接口的不同实现类

最近做项目,有个需求是和外部对接,从接口获取新闻数据,把数据和缓存中的数据对比,多了的添加到数据库,少了的删掉。

接口有两个,一开始我是在业务类里写了两个方法,代码太长,简单说就是两个部分:

public Object saveANews() {
	//1、获取A接口新闻列表
    //2、和缓存对比,存数据到数据库
}
 
public Object saveBNews() {
	//1、获取B新闻列表
    //2、和缓存对比,存数据到数据库
}

写完后我发现,因为操作的是数据库的同一张表,2的部分代码完全一模一样,只有1的部分不同,而1的部分其实就只有一行代码。。。

这必须得复用啊,而且是一个业务,也没必要分别用两个方法,于是我改成了这样:

//业务接口实现方法
public Object saveNews(NewsUtilService service) {
	//1、获取接口新闻列表
    List<NewsVO> list = service.queryNews();
    //2、和缓存对比,存数据到数据库
}
 
//定义新闻数据接口
public interface NewsUtilService {
    List<NewsVO> queryNews();
}
 
//接口的两个实现类
@Service
public class ANewsDataServiceImpl implements NewsUtilService { 
    @Autowired
	private NewsDataMapper newsDataMapper;
 
    @Override
	public List<NewsVO> queryNews(){
		//对接数据
	}
}
 
@Service
public class BNewsDataServiceImpl implements NewsUtilService {
    @Override
	public List<NewsVO> queryNews(){
		//对接数据
	}
}
 
//定义工厂类
@Service
public class NewsUtilServiceFactory {	
	
	public NewsUtilService getNewsUtilService(String source){
		switch(source){
			case "a":
				return new ANewsDataServiceImpl();
			case "b":
				return new BNewsDataServiceImpl();
			default:
				return null;
		}
	}
}
 
//控制层调用
@RestController
public class NewsDataController {
    @Resource
    private NewsDataService newsDataService;
    
    @Resource
    private NewsUtilServiceFactory factory;
 
    public Object getNewsData(){
        String[] sources = {"a","b"};
    		for (int i = 0; i < sources.length; i++) {
    			NewsUtilService newsUtilService = factory.getNewsUtilService(sources[i]);
    			newsDataService.saveNews(newsUtilService);
			}
    }
}

本来以为这就大工告成了,谁知道运行后控制台居然报错了:

经过一步步调试,总算发现了是什么问题:

其中一个实现类中注入的Mapper没有实例化,是null。

一开始我还以为是构造函数调用和注入的顺序问题,查了半天才明白不是,问题在这里:

使用new关键字实例化的对象不是被spring创建的,不归spring管,所以A类实现类中Mapper注入的注解根本不生效!

但是因为业务需要,那个mapper又需要用到,怎么办呢?

当时想到了两种解决办法

1、在接口的方法参数里加入mapper,把mapper作为参数传进去,但这实在太奇怪了,先不说B类实现类根本用不到mapper,而且一个接口定义出来后根本不管它的实现类吧,因为实现类的问题去改接口,,,似乎有点非呀。

于是决定用第二种,修改工厂类变成如下:

//定义工厂类
@Service
public class NewsUtilServiceFactory {	
    @Autowired
    private ANewsDataServiceImpl aNewsDataServiceImpl;
    @Autowired
    private BNewsDataServiceImpl bNewsDataServiceImpl; 
	public NewsUtilService getNewsUtilService(String source){
		switch(source){
			case "a":
				return aNewsDataServiceImpl;
			case "b":
				return bNewsDataServiceImpl;
			default:
				return null;
		}
	}
}

代码写出来自己都无语了,先把所有的实现类都实例化出来,在根据输入返回。这不是工厂模式,是商店模式吧。。。但是当时也想不到其他办法,就先这么写了,但一直觉得肯定有其他解决方案,直到今天有空,去查了一下,才发现自己都多low。。。

其实spring可以动态获取实现类的~~~

@Service
public class NewsUtilServiceFactory {	
	@Autowired
	private ApplicationContext applicationContext;	
	public NewsUtilService getNewsUtilService(String source){
		switch(source){
			case "WEB":
				return applicationContext.getBean(WebNewsDataServiceImpl.class);
			case "oa":
				return applicationContext.getBean(OANewDataServiceImpl.class);
			default:
				return null;
		}
	}
}

这才是正确写法有木有!

总算弄出来了,赶紧记录下来先~

获取某接口所有实现类

SpringBoot项目中,为了方便,我们可能需要获取某一个接口下面的所有实现类,根据名称进行匹配使用。

正文

1、ServiceLocator.java

package com.yang.config;
import com.yang.workOrder.service.IRootService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;

@Component
public class ServiceLocator implements ApplicationContextAware {
    
    private Map<String, IRootService> map;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        //根据接口类型返回相应的所有bean
        map = applicationContext.getBeansOfType(IRootService.class);
    }
    
    public Map<String, IRootService> getMap() {
        return map;
    }
    
    public IRootService getService(String key) {
        return map.get(key);
    }
}

2、IRootService.java

package com.yang.workOrder.service;
import com.alibaba.fastJSON.jsONObject;
import com.yang.workOrder.entity.WorkOrder;

public interface IRootService {
    
    boolean startProcess(WorkOrder workOrder);
}

3、RootA001ServiceImpl.java

package com.yang.workOrder.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.yang.workOrder.entity.WorkOrder;
import com.yang.workOrder.service.IRootService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service("A_001")
public class RootA001ServiceImpl implements IRootService {
    private static final Logger LOGGER = LoggerFactory.getLogger(RootA001ServiceImpl.class);
    @Override
    public boolean startProcess(WorkOrder workOrder) {
        return false;
    }
}

4、RootA002ServiceImpl.java

package com.yang.workOrder.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.yang.workOrder.entity.WorkOrder;
import com.yang.workOrder.service.IRootService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service("A_002")
public class RootA002ServiceImpl implements IRootService {
    private static final Logger LOGGER = LoggerFactory.getLogger(RootA002ServiceImpl.class);
    @Override
    public boolean startProcess(WorkOrder workOrder) {
        return false;
    }
}

结果

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 使用spring动态获取接口的不同实现类

本文链接: https://www.lsjlt.com/news/140516.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用spring动态获取接口的不同实现类
    目录spring动态获取接口的不同实现类当时想到了两种解决办法获取某接口所有实现类正文结果spring动态获取接口的不同实现类 最近做项目,有个需求是和外部对接,从接口获取新闻数据,...
    99+
    2024-04-02
  • 如何使用spring动态获取接口的不同实现类
    这篇“如何使用spring动态获取接口的不同实现类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用spring动态获取...
    99+
    2023-06-29
  • 使用Spring特性实现接口多实现类的动态调用方式
    目录正好用到。mark一下背景问题的提出首先我们看一下这个方法的签名接下来看看我们遇到的问题是什么?实现代码如下验证关于SPI下面是JDBC驱动的接口下面是MySQL的JDBC驱动实...
    99+
    2024-04-02
  • 怎么使用Spring特性实现接口多类的动态调用
    今天小编给大家分享一下怎么使用Spring特性实现接口多类的动态调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正好用到。...
    99+
    2023-06-29
  • spring boot 动态生成接口实现类的场景分析
    目录一:定义注解二:建立动态代理类三:注入spring容器四:编写拦截器五:新建测试类在某些业务场景中,我们只需要业务代码中定义相应的接口或者相应的注解,并不需要实现对应的逻辑。 比...
    99+
    2024-04-02
  • 利用Java如何获取Mybatis动态生成的sql接口实现
    目录前言1、编写xml: SqlGenarate.mapper.xml2、定义接口3、实现接口总结前言 如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 S...
    99+
    2024-04-02
  • Spring的@Autowired加到接口上但获取的是实现类的问题
    目录@Autowired加到接口上但获取的是实现类问题为什么他会拿到userServiceImpl?@Autowired一个接口有多个实现类例如@Autowired加到接口上但获取的...
    99+
    2024-04-02
  • Java SpringBoot 获取接口实现类汇总
    目录前言一、获取接口的所有实现类1、枚举2、业务接口2.1 实现类3、ApplicationContextAware接口实现类4、获取到所有实现类使用前言 有时候,根据业务逻辑的需求...
    99+
    2024-04-02
  • Java如何获取接口所有的实现类
    目录Java获取接口所有的实现类反射获取接口的所有实现类总结Java获取接口所有的实现类 最近因业务需求,要实现NodeRed服务后端化,为使各个节点的解析进行插件化(NodeRed...
    99+
    2023-01-09
    Java接口 Java实现类 Java获取接口实现类
  • spring boot动态生成接口怎么实现
    本篇内容主要讲解“spring boot动态生成接口怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring boot动态生成接口怎么实现”吧!在某些业务场景中,我...
    99+
    2023-06-21
  • springboot怎么通过不同的策略动态调用不同的实现类
    这篇“springboot怎么通过不同的策略动态调用不同的实现类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springb...
    99+
    2023-06-29
  • springboot如何通过不同的策略动态调用不同的实现类
    目录通过不同的策略动态调用不同的实现类代码演示可能用到的场景举例spring中动态选择实现类方案一方案二通过不同的策略动态调用不同的实现类 经常遇到这样的一个需求,前端传的实体类型相...
    99+
    2024-04-02
  • vue中使用echarts实现动态数据绑定以及获取后端接口数据
    目录前言1.柱状图2.折线图 3.饼状图 4.地图 总结前言 之前几篇echarts的文章是实现了静态的柱状图、折线图、饼状图、地图,在项目中我们肯定是...
    99+
    2024-04-02
  • springboot如何获取接口下所有实现类
    目录springboot获取接口下所有实现类springboot动态调用实现类1、添加接口2、创建实现类3、获取实现类的相关接口 springboot获取接口下所有实现类 ...
    99+
    2024-04-02
  • 如何在ASP中使用Spring接口实现同步?
    ASP是一种非常流行的Web开发技术,而Spring则是一个非常流行的Java开发框架。这篇文章将介绍如何在ASP中使用Spring接口实现同步。 什么是Spring Spring是一个非常流行的Java开发框架,它提供了丰富的功能和工...
    99+
    2023-09-02
    同步 spring 接口
  • 详解Spring中实现接口动态的解决方法
    前言本文主要给大家介绍的是关于Spring实现接口动态的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧。关于这个问题是因为领导最近跟我提了一个需求,是有关于实现类Mybatis的@Select、@Insert注解的功...
    99+
    2023-05-31
    spring 动态接口
  • vue中如何使用echarts实现动态数据绑定及获取后端接口数据
    本篇内容主要讲解“vue中如何使用echarts实现动态数据绑定及获取后端接口数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue中如何使用echarts实现动态数据绑定及获取后端接口数据”...
    99+
    2023-07-02
  • 使用Springboot根据配置文件动态注入接口实现类
    Springboot根据配置文件动态注入接口实现类 需求 最近在做一个Springboot项目,需要面向不同需求的客户,但是为了方便管理分支,需要将不同客户的需求都写到同一套代码中,...
    99+
    2024-04-02
  • 使用Golang接口类型实现参数的多态化
    使用 go 语言接口类型可以实现参数多态化,使函数或方法可以接受实现相同接口的不同类型参数,如示例中计算不同形状面积的函数 calculatearea。在实际应用中,接口类型可增强函数灵...
    99+
    2024-04-13
    golang
  • Spring中的bean怎么利用Aware接口获取
    这期内容当中小编将会给大家带来有关Spring中的bean怎么利用Aware接口获取,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在使用spring编程时,常常会遇到想根据bean的名称来获取相应的bea...
    99+
    2023-05-31
    spring bean aware
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作