这里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自动注册的实现方案的更多相关文章

  1. spring bean自动注入

    使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的 ...

  2. Spring boot 梳理 - Spring boot自动注册DispatcherServlet

    spring boot提供的DispatcherServlet的name就是“dispatcherServlet”. 源码 public ServletRegistrationBean dispatc ...

  3. spring——bean自动装配

    注意:自动装配功能和手动装配要是同时使用,那么自动装配就不起作用. beans.xml <?xml version="1.0" encoding="UTF-8&qu ...

  4. Spring之2:Spring Bean动态注册、删除

    IoC容器的初始化包括BeanDefinition的Resource定位.载入和注册这三个基本的过程. 一.Resource定位.BeanDefinition的资源定位有resourceLoader通 ...

  5. Spring Bean自动装配有哪些方式?

    Spring 容器能够自动装配 Bean .也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 Bean 的协作者. 自动装配的不同模式: no - 这是默认设置,表示没 ...

  6. Spring Bean自动检测

    1-自动检测bean 需要用到<context:component-scan> 注意:a) 需要include进来xmlns:context命名空间:base-package指的是我们要扫 ...

  7. Spring 学习笔记(2) Spring Bean

    一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...

  8. Spring 自动装配及自动注册的相关配置

    Spring支持好几种自动装配(Autowiring)的方式,以及自动扫描并注册Bean的配置(在beans.xml中配置). 下文我们进行一个小结. 1. <context: annotati ...

  9. Spring Boot 使用Java代码创建Bean并注册到Spring中

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: packa ...

随机推荐

  1. 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 ...

  2. IndexedDB(二:索引)

    在HTML5本地存储--IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器--索引. 熟悉数据库的同学都知道索引的一个好处 ...

  3. 第9章 CSS3中的变形与动画(下)

    Keyframes介绍 Keyframes被称为关键帧,其类似于Flash中的关键帧.在CSS3中其主要以"@keyframes"开头,后面紧跟着是动画名称加上一对花括号" ...

  4. 三大图表库:ECharts 、 BizCharts 和 G2,该如何选择?

    最近阿里正式开源的BizCharts图表库基于React技术栈,各个图表项皆采用了组件的形式,贴近React的使用特点.同时BizCharts基于G2进行封装,Bizcharts也继承了G2相关特性. ...

  5. 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. ...

  6. 用Eclipse创建第一个Spring项目(最最入门级)

    http://blog.csdn.net/shymi1991/article/details/48085955 网上关于Spring的介绍资料已经数不胜数,但大多篇幅冗长,初学者不易理解记忆.这里先作 ...

  7. 深入理解java的形参和实参

    转载声明:本文转载自公众号「码匠笔记」. 前几天在头条上看到一道经典面试题,引发了一些思考.也是写这篇文章的导火索. 背景 请看题: public    classMain{    publicsta ...

  8. 如何在 Maven 工程中引入其他jar包 并生效?(以 Netty 为例)

    1.到 Maven 官网  查找 相关 框架 https://mvnrepository.com/artifact/io.netty/netty-all/4.1.32.Final 2.把相关 Xml体 ...

  9. Going Deeper with Convolutions(Inception v1)笔记

    目录 Abstract Introduction First of All Inception Depth Related Work Motivation and High Level Conside ...

  10. 使用qt的hostInfo类,查看本机的IP和设备

    创建NetWorkInformation类,main.cpp直接生成. #include "networkinformation.h" #include <QApplicat ...