当前位置:   article > 正文

注解处理器、ServiceLoader 开发SpringCloud启动参数拓展类_implements launcherservice

implements launcherservice

起因

在SpringCloud项目中,每一个SpringBoot工程都要在bootstrap里面配置nacos的注册地址和命名空间等等,多个服务每个服务里面都配置同样的内容,于是就想这些通用的配置能不能集中起来进行配置,于是借助bladex框架中的处理方式,进行了一定研究

System.getProperties()

在bladex中,自定义了一个springboot启动器类的方式,在run方法执行之前进行了根据项目运行环境的动态配置,在最后通过ServiceLoader加载LauncherService接口的实现类,这个接口的实现类中可以启动参数进行配置

 

  1. public static SpringApplicationBuilder createSpringApplicationBuilder(String appName, Class source, String... args) {
  2. ...
  3. // 加载自定义组件
  4. List<LauncherService> launcherList = new ArrayList<>();
  5. ServiceLoader.load(LauncherService.class).forEach(launcherList::add);
  6. launcherList.stream().sorted(Comparator.comparing(LauncherService::getOrder)).collect(Collectors.toList())
  7. .forEach(launcherService -> launcherService.launcher(builder, appName, profile, isLocalDev()));
  8. return builder;
  9. }

进入到实现类中,发现这里面是通过java原生的的,System.setProperties()方法,设置系统参数,由此可以发现,Springboot的环境变量会收集System.GetProperties里面的参数

 

  1. /**
  2. * 启动参数拓展服务
  3. */
  4. @AutoService(LauncherService.class)
  5. public class LauncherPropsServiceImpl implements LauncherService {
  6. @Override
  7. public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) {
  8. Properties props = System.getProperties();
  9. // nacos 通用配置
  10. PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile));
  11. PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile));
  12. PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.nacosNameSpace(profile));
  13. PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.nacosNameSpace(profile));
  14. PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.service", appName);
  15. }
  16. }

ServiceLoad

上面在启动类里面看到了,通过ServiceLoader加载项目中自定义的参数拓展接口的实现类并运行,这是一种符合开闭原则的设计方式,新增或者修改启动参数,新建一个实现类就可以了 ServiceLoad的原理目前还没有细看,只知道他的作用就是: 能够根据接口加载到散布在系统各个包中的实现类 ,这些实现类必须在resource/META-INF/services包下面声明,文件的名字是接口的全限定名,文件里面配置实现类的全限定名,换行作为分隔

AutoService注解

我们已经知道了,ServiceLoad的注册需要手动创建注册文件,然而在bladex中发现他是通过在实现类上标注@AutoService注解 ,value属性中填入接口的全限定名这种方式,自动创建的注册文件这里的实现方式,就是通过自定义注解,搭配注解处理器,这个注解在google-auto包中有现成的实现,但是bladex中似乎是自己仿写了一下,估计是为了学习一下注解处理器的运用吧,那么我也就了解一下这个东西

注解处理器

注解处理器的作用就是在代码编译的阶段,对指定注解标注了的类,方法,属性等进行处理,一般用于在编译阶段生成一些代码,著名的lombok插件就是利用这个原理,在编译阶段根据注解生成相应的代码,下面首先了解一下注解处理器的使用:

  • 注解处理器类需要集成 AbstractProcessor 类 主要关注里面的四个方法
  1. init: 初始化方法,这个方法通常用于实例化一些工具类用于下面处理使用
  2. getSupportedSourceVersion: 重写此方法可以指定支持的java版本
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57724
推荐阅读
相关标签
  

闽ICP备14008679号