值得收藏的SpringBoot实用的小技巧

  

  

最近分享的一些源码,框架设计的东西。我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多;这次就分享一点接地气的:SpringBoot使用中的一些小技巧。

  

算不上多高大上的东西,但都还挺有用。

  

  

第一个是屏蔽外部依赖,什么意思呢?

  

比如大家日常开发时候有没有这样的烦恼:

  

项目是基于SpringCloud或者是达博这样的分布式服务,你需要依赖许多基础服务。

  

比如说某个订单号的生成,获取用户信息等。

  

由于服务拆分,这些功能都是在其他应用中以接口的形式提供,单测还好我还可以利用模拟把它屏蔽掉。

  

但如果自己想把应用启动起来同时把自己相关的代码跑一遍呢?

  

通常有几种做法:
  

  

& # 8226;本地把所有的服务都启动起来。
  & # 8226;把注册中心换为开发环境,依赖开发环境的服务。
  & # 8226;直接把代码推送到开发环境自测。

  

看起来三种都可以,以前我也是这么干的。但还是有几个小问题:
  

  

& # 8226;本地启动有可能服务很多,全部起来电脑能不能撑住还两说,万一服务有问题就进行不下去了。
  & # 8226;依赖开发环境的前提是网络打通,还有一个问题就是开发环境代码很不稳定很大可能会影响你的测试。
  & # 8226;推送到开发环境应该是比较靠谱的方案,但如果想调试只有日志大法,没有本地调试的效率高效。

  

那如何解决问题呢?既可以在本地调试也不用启动其他服务。

  

其实也可以利用单测的做法,把其他外部依赖模拟掉就行了。

  

大致的流程分为以下几步:
  

  

& # 8226; SpringBoot启动之后在春天中找出你需要屏蔽的那个API的bean(通常情况下这个接口都是交给弹簧管理的)。
  & # 8226;手动从bean容器中删除该bean。
  & # 8226;重新创建一个该API的对象,只不过是通过模拟出来的。
  & # 8226;再手动注册进bean容器中。

  

以下面这段代码为例:
  

        @Override   公共BaseResponsegetUserByHystrix (@RequestBody UserReqVO UserReqVO) {      OrderNoReqVO vo=new OrderNoReqVO ();   vo.setAppId (123 l);   vo.setReqNo (userReqVO.getReqNo ());   BaseResponseorderNo=orderServiceClient.getOrderNo (vo);   返回orderNo;   }      

这是一个SpringCloud应用。

  

它依赖于orderServiceClient获取一个订单号。

  

其中的orderServiceClient就是一个外部的API,也是被春天所管理。

  

替换原有憨豆的

  

下一步就是替换原有憨豆的。
  

        @ component   公共类OrderMockServiceConfig实现CommandLineRunner {      私人最终静态日志记录器=LoggerFactory.getLogger (OrderMockServiceConfig.class);      @ autowired   私人ApplicationContext ApplicationContext;      @ value (" $ {excute.env} ")   私人字符串env;      @Override   公共空间运行(字符串…字符串){抛出异常//非本地环境不做处理   如果(dev .equals (env) | |“测试”.equals (env) | |“pro”.equals (env)) {   返回;   }      DefaultListableBeanFactory DefaultListableBeanFactory=(DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory ();      OrderServiceClient OrderServiceClient=defaultListableBeanFactory.getBean (OrderServiceClient.class);   logger.info (“======orderServiceClient {}=====", orderServiceClient.getClass ());      defaultListableBeanFactory.removeBeanDefinition (OrderServiceClient.class.getCanonicalName ());      OrderServiceClient mockOrderApi=PowerMockito.mock (OrderServiceClient.class,   invocationOnMock→BaseResponse.createSuccess (DateUtil.getLongTime() + ", "模拟orderNo成功"));      defaultListableBeanFactory.registerSingleton (OrderServiceClient.class.getCanonicalName (), mockOrderApi);      logger.info (“======mockOrderApi {}=====", mockOrderApi.getClass ());   }   }      

其中实现了CommandLineRunner接口,可以在春容器初始化完成之后调用运行()方法。

  

代码非常简单,简单来说首先判断下是什么环境,毕竟除开本地环境其余的都是需要真正调用远程服务的。

  

之后就是获取豆然后手动删除掉。

  

关键的一步:
  

值得收藏的SpringBoot实用的小技巧