Spring Bean自动注册的实现方案
这里Spring管理的Bean,可以认为是一个个的Service,每个Service都是一个服务接口
自动注册Service的好处:
1、根据指定的name/id获取对应的Service,实现简单工厂
2、服务自动注册到Map中,集中管理
方案1:通过接口实现
1、声明接口:定义接口的方法,这里用到的泛型可以根据实际需要忽略
/**
* @Description: 资金请求处理 接口
* -- 资金类操作的公共接口
* @author: lishh
* @Date: 2019/1/16 20:40
*/
public interface IFundReqHandleService<Req extends BaseRequest, Resp extends BaseResponse, DO extends CommonDO> {
//接口定义忽略...
}
2、接口实现

实现举例:注意:每个实现类都定义了一个final的值,作为它的id,以后拿着这个id获取这个服务
/**
* @Description: 入金
* @author: lishh
* @Date: 2019/1/4 15:55
*/
@Service
public class FundinServiceImpl implements IFundReqHandleService<FundinReq, FundinResp, Fundin> {
private static Logger logger = LoggerFactory.getLogger(FundinServiceImpl.class);
private final RequestTypeEnum fundReqType = RequestTypeEnum.FUND_IN; @Autowired
private FundinMapper fundinMapper; //...略....
}
3、定义获取服务的工厂类:这里的RequestTypeEnum定义为枚举是为了可读性更好,使用字符串也可以
/**
* @Description: 资金操作服务 工厂
* @author: lishh
* @Date: 2019/1/4 17:39
*/
public interface IFundServiceFactory { /**
* 根据请求类型 获取对应的handler
*
* @param fundType
* @return
*/
IFundReqHandleService getService(RequestTypeEnum fundType);
}
4、实现工厂类,提供服务获取的实现:代码很简单,关键就是注入Map<String, IFundReqHandleService> fundFlowMap;
/**
* @Description: 资金操作服务 工厂
* @author: lishh
* @Date: 2019/1/4 17:44
*/
@Component("fundServiceFactory")
public class FundServiceFactoryImpl implements IFundServiceFactory, InitializingBean {
private static Logger logger = LoggerFactory.getLogger(FundServiceFactoryImpl.class); /**
* 注入实现IReqHandleService接口的所有服务
* key: service name
* value:服务引用
*/
@Autowired
Map<String, IFundReqHandleService> fundFlowMap; /**
* 资金操作handler Map
* key:服务类型
* value:服务引用
*/
private Map<RequestTypeEnum, IFundReqHandleService> serviceMap = new ConcurrentHashMap<>(); /**
* 获取服务
*
* @param fundType
* @return
*/
@Override
public IFundReqHandleService getService(RequestTypeEnum fundType) {
IFundReqHandleService service = this.getServiceMap().get(fundType);
if (null == service) {
logger.error("invalid or unsupport fundType:{},current serviceMap:{}",
JSON.toJSONString(fundType),
JSON.toJSONString(this.getServiceMap()));
} return service;
} /**
* 服务自动注册...
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
for (Map.Entry<String, IFundReqHandleService> entry : fundFlowMap.entrySet()) {
RequestTypeEnum reqType = entry.getValue().getReqType();
this.getServiceMap().put(reqType, entry.getValue());
logger.info("regist service:{}-->{}.current map size:{}", entry.getKey(), reqType.getReqType(), this.getServiceMap().size());
}
} public Map<RequestTypeEnum, IFundReqHandleService> getServiceMap() {
return serviceMap;
} }
5、使用
很简单,注入工厂类,提供id给你获取服务
/**
* 资金类请求处理服务工厂
*/
@Resource(name = "fundServiceFactory")
private IFundServiceFactory fundServiceFactory; //...略。。。。 //01、获取业务处理对象
IFundReqHandleService reqHandler = fundServiceFactory.getService(requestType);
if (null == reqHandler) {
throw new SysException(ErrorCodeEnum.ACCT_SERVICE_ERROR, "unsupport requestType");
}
//。。。。调用服务接口,略,...
总结:
1、spring注入的理解
2、InitializingBean接口的理解
方案2:通过注解annotation实现
注解
注解
Spring Bean自动注册的实现方案的更多相关文章
- spring bean自动注入
使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的 ...
- Spring boot 梳理 - Spring boot自动注册DispatcherServlet
spring boot提供的DispatcherServlet的name就是“dispatcherServlet”. 源码 public ServletRegistrationBean dispatc ...
- spring——bean自动装配
注意:自动装配功能和手动装配要是同时使用,那么自动装配就不起作用. beans.xml <?xml version="1.0" encoding="UTF-8&qu ...
- Spring之2:Spring Bean动态注册、删除
IoC容器的初始化包括BeanDefinition的Resource定位.载入和注册这三个基本的过程. 一.Resource定位.BeanDefinition的资源定位有resourceLoader通 ...
- Spring Bean自动装配有哪些方式?
Spring 容器能够自动装配 Bean .也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 Bean 的协作者. 自动装配的不同模式: no - 这是默认设置,表示没 ...
- Spring Bean自动检测
1-自动检测bean 需要用到<context:component-scan> 注意:a) 需要include进来xmlns:context命名空间:base-package指的是我们要扫 ...
- Spring 学习笔记(2) Spring Bean
一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...
- Spring 自动装配及自动注册的相关配置
Spring支持好几种自动装配(Autowiring)的方式,以及自动扫描并注册Bean的配置(在beans.xml中配置). 下文我们进行一个小结. 1. <context: annotati ...
- Spring Boot 使用Java代码创建Bean并注册到Spring中
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: packa ...
随机推荐
- git自动更新网站代码
1.实现过程在linux上安装git服务.创建源版本库.从源版本库克隆得到网站目录,然后利用git中的hooks机制,在git push推送代码到源版本库的时候,触发编写的shell脚本,更新网站目录 ...
- 把连接中传的参数截取出来变成一个json对象
获取url function test() { var url=window.location.search; if(url.indexOf("?")!=-1) { var str ...
- SpringCloud+Git+Maven+Docker+Jenkins自动化构建
1.JDK安装-OpenJDK安装 yum list java-1.8* yum install -y java-1.8.0-openjdk-devel.x86_64 PS: JDK安装有两种方法:一 ...
- visual studio code断点调试react
在项目配置文件 .vscode\launch.json 中添加: "sourceMaps": true, "skipFiles": [ &quo ...
- Opencv2.4.13与Visual Studio2013环境搭建配置教程
转载:http://www.jb51.net/article/108943.htm 一.安装包的下载与安装 Opencv可免费到官网上去下载,opencv是国外软件,在下载是由于受资源的限制,可能会出 ...
- C# mvc读取模板并修改上传到web
C# mvc读取模板并修改上传到web 后台: public FileResult GetXls() { FileStream fs = new FileStream(System.Web.HttpC ...
- git revert .vs. git reset .vs. git rebase
1. git rervert的工作方式是:将一个老的commit的改动完全找出来,并且在新的tip处运行反操作,最终清除老commit的改动: git revert的应用场景多在对public rep ...
- JavaScript返回上一页
目前来说有两种方法: window.history.back(); // 返回上一页不刷新 window.location.href = document.referrer; // 返回上一页并刷新
- Can't create new folder in windows7
First, please use System File Checker tool to troubleshoot(诊断) this issue. If the issue persists, im ...
- git-day1-安装和基础使用
Git介绍 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件 ...