zoukankan      html  css  js  c++  java
  • Spring Bean自动注册的实现方案

    这里Spring管理的Bean,可以认为是一个个的Service,每个Service都是一个服务接口

    自动注册Service的好处:

    1、根据指定的name/id获取对应的Service,实现简单工厂

    2、服务自动注册到Map中,集中管理

    方案1:通过接口实现


    1、声明接口:定义接口的方法,这里用到的泛型可以根据实际需要忽略

    1 /**
    2  * @Description: 资金请求处理 接口
    3  * -- 资金类操作的公共接口
    4  * @author: lishh
    5  * @Date: 2019/1/16 20:40
    6  */
    7 public interface IFundReqHandleService<Req extends BaseRequest, Resp extends BaseResponse, DO extends CommonDO> {
    8     //接口定义忽略...
    9 }

    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定义为枚举是为了可读性更好,使用字符串也可以

     1 /**
     2  * @Description: 资金操作服务 工厂
     3  * @author: lishh
     4  * @Date: 2019/1/4 17:39
     5  */
     6 public interface IFundServiceFactory {
     7 
     8     /**
     9      * 根据请求类型 获取对应的handler
    10      *
    11      * @param fundType
    12      * @return
    13      */
    14     IFundReqHandleService getService(RequestTypeEnum fundType);
    15 }

    4、实现工厂类,提供服务获取的实现:代码很简单,关键就是注入Map<String, IFundReqHandleService> fundFlowMap;

     1 /**
     2  * @Description: 资金操作服务 工厂
     3  * @author: lishh
     4  * @Date: 2019/1/4 17:44
     5  */
     6 @Component("fundServiceFactory")
     7 public class FundServiceFactoryImpl implements IFundServiceFactory, InitializingBean {
     8     private static Logger logger = LoggerFactory.getLogger(FundServiceFactoryImpl.class);
     9 
    10     /**
    11      * 注入实现IReqHandleService接口的所有服务
    12      * key: service name
    13      * value:服务引用
    14      */
    15     @Autowired
    16     Map<String, IFundReqHandleService> fundFlowMap;
    17 
    18     /**
    19      * 资金操作handler Map
    20      * key:服务类型
    21      * value:服务引用
    22      */
    23     private Map<RequestTypeEnum, IFundReqHandleService> serviceMap = new ConcurrentHashMap<>();
    24 
    25     /**
    26      * 获取服务
    27      *
    28      * @param fundType
    29      * @return
    30      */
    31     @Override
    32     public IFundReqHandleService getService(RequestTypeEnum fundType) {
    33         IFundReqHandleService service = this.getServiceMap().get(fundType);
    34         if (null == service) {
    35             logger.error("invalid or unsupport fundType:{},current serviceMap:{}",
    36                     JSON.toJSONString(fundType),
    37                     JSON.toJSONString(this.getServiceMap()));
    38         }
    39 
    40         return service;
    41     }
    42 
    43     /**
    44      * 服务自动注册...
    45      *
    46      * @throws Exception
    47      */
    48     @Override
    49     public void afterPropertiesSet() throws Exception {
    50         for (Map.Entry<String, IFundReqHandleService> entry : fundFlowMap.entrySet()) {
    51             RequestTypeEnum reqType = entry.getValue().getReqType();
    52             this.getServiceMap().put(reqType, entry.getValue());
    53             logger.info("regist service:{}-->{}.current map size:{}", entry.getKey(), reqType.getReqType(), this.getServiceMap().size());
    54         }
    55     }
    56 
    57     public Map<RequestTypeEnum, IFundReqHandleService> getServiceMap() {
    58         return serviceMap;
    59     }
    60 
    61 }

    5、使用

    很简单,注入工厂类,提供id给你获取服务

     1 /**
     2      * 资金类请求处理服务工厂
     3      */
     4     @Resource(name = "fundServiceFactory")
     5     private IFundServiceFactory fundServiceFactory;
     6 
     7 //...略。。。。
     8 
     9  //01、获取业务处理对象
    10             IFundReqHandleService reqHandler = fundServiceFactory.getService(requestType);
    11             if (null == reqHandler) {
    12                 throw new SysException(ErrorCodeEnum.ACCT_SERVICE_ERROR, "unsupport requestType");
    13             }
    14 //。。。。调用服务接口,略,...

    总结:

    1、spring注入的理解

    2、InitializingBean接口的理解

    方案2:通过注解annotation实现


    注解

    注解

  • 相关阅读:
    王爽汇编实验(八)
    王爽汇编实验(七)
    王爽汇编实验(六)
    王爽汇编实验(五)
    计算机操作系统锁机制.
    网页搜索框里显示字段鼠标点击后就隐藏的方法
    织梦删掉会员空间,保留开放会员(禁止注册)的方法
    织梦DEDECMS后台验证码错误不能正常验证的3种可能原因和解决
    织梦DEDECMS后台验证码错误不能正常验证的3种可能原因和解决
    织梦怎么对某些字段信息隐藏,登录后可查看
  • 原文地址:https://www.cnblogs.com/huahua035/p/10644983.html
Copyright © 2011-2022 走看看