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 ...
随机推荐
- How to limit Dialog's max height?
1. We can make it to play trick in code. At Dialog's show function, after app has set contentView, w ...
- IndexedDB(二:索引)
在HTML5本地存储--IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器--索引. 熟悉数据库的同学都知道索引的一个好处 ...
- 第9章 CSS3中的变形与动画(下)
Keyframes介绍 Keyframes被称为关键帧,其类似于Flash中的关键帧.在CSS3中其主要以"@keyframes"开头,后面紧跟着是动画名称加上一对花括号" ...
- 三大图表库:ECharts 、 BizCharts 和 G2,该如何选择?
最近阿里正式开源的BizCharts图表库基于React技术栈,各个图表项皆采用了组件的形式,贴近React的使用特点.同时BizCharts基于G2进行封装,Bizcharts也继承了G2相关特性. ...
- ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误
ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误 1.测试环境说明 ArcSDE版本:10.2.2 Oracle版本:12.1.0.1和11. ...
- 用Eclipse创建第一个Spring项目(最最入门级)
http://blog.csdn.net/shymi1991/article/details/48085955 网上关于Spring的介绍资料已经数不胜数,但大多篇幅冗长,初学者不易理解记忆.这里先作 ...
- 深入理解java的形参和实参
转载声明:本文转载自公众号「码匠笔记」. 前几天在头条上看到一道经典面试题,引发了一些思考.也是写这篇文章的导火索. 背景 请看题: public classMain{ publicsta ...
- 如何在 Maven 工程中引入其他jar包 并生效?(以 Netty 为例)
1.到 Maven 官网 查找 相关 框架 https://mvnrepository.com/artifact/io.netty/netty-all/4.1.32.Final 2.把相关 Xml体 ...
- Going Deeper with Convolutions(Inception v1)笔记
目录 Abstract Introduction First of All Inception Depth Related Work Motivation and High Level Conside ...
- 使用qt的hostInfo类,查看本机的IP和设备
创建NetWorkInformation类,main.cpp直接生成. #include "networkinformation.h" #include <QApplicat ...