这里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. SZU1

    CodeForces 518A 字符串进位.. #include <iostream> #include <string> #include <cstring> # ...

  2. Scarpy+selenium 结合使用

    首先要先在spider对象实例化时,同时实例化一个浏览器对象 # -*- coding: utf-8 -*- import scrapy from selenium import webdriver ...

  3. 比较全的css重设

    一.最简化的CSS Reset(重设) : * { padding:; margin:; } 这是最普遍最简单的CSS重设,将所有元素的padding和margin值都设为0,可以避免一些浏览器在理解 ...

  4. svg拖拽和缩放

    需求:做机房平面图,用svg实现拖拽和缩放,刚开始一头雾水,不知所措,好在皇天不负有心人........ 本文重点介绍拖拽,单纯实现很简单,但是由于vue项目,机房图有很多事件,拖拽就成了难点 简单介 ...

  5. parted命令

    fdisk命令是针对MBR分区进行操作,MBR分区因为自身设计原因,不能处理大于2TB的硬盘,并且只能有4个分区. 针对大于2TB的硬盘,需要采用GPT分区,使用parted命令进行操作 parted ...

  6. python 多进程数据交互及共享

    多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最 ...

  7. Django_MTV模型

    创建DJango项目过程: 1:安装Django包 方式一:pip3 install django 方式二:pycharm-->file--->settings-->找到projec ...

  8. 设计模式:命令(Command)模式

    设计模式:命令(Command)模式 一.前言 命令也是类,将命令作为一个类来保存,当要使用的时候可以直接拿来使用,比如脚本语言写出的脚本,只需要一个命令就能执行得到我们想要的需要操作很长时间才能得到 ...

  9. ping -l 1000 -t 与ping -t的区别

    windows -l 1000的意思是规定发送的包的大小是1000字节如果不加这个参数的话,就发送包默认为32字节还有-t就是一直发送,直到手动停止

  10. ThinkPHP最新版本SQL注入漏洞

    如下controller即可触发SQL注入: code 区域 public function test() { $uname = I('get.uname'); $u = M('user')-> ...