赞
踩
在SpringCloud项目中,每一个SpringBoot工程都要在bootstrap里面配置nacos的注册地址和命名空间等等,多个服务每个服务里面都配置同样的内容,于是就想这些通用的配置能不能集中起来进行配置,于是借助bladex框架中的处理方式,进行了一定研究
在bladex中,自定义了一个springboot启动器类的方式,在run方法执行之前进行了根据项目运行环境的动态配置,在最后通过ServiceLoader加载LauncherService接口的实现类,这个接口的实现类中可以启动参数进行配置
- public static SpringApplicationBuilder createSpringApplicationBuilder(String appName, Class source, String... args) {
- ...
- // 加载自定义组件
- List<LauncherService> launcherList = new ArrayList<>();
- ServiceLoader.load(LauncherService.class).forEach(launcherList::add);
- launcherList.stream().sorted(Comparator.comparing(LauncherService::getOrder)).collect(Collectors.toList())
- .forEach(launcherService -> launcherService.launcher(builder, appName, profile, isLocalDev()));
- return builder;
- }
进入到实现类中,发现这里面是通过java原生的的,System.setProperties()方法,设置系统参数,由此可以发现,Springboot的环境变量会收集System.GetProperties里面的参数
- /**
- * 启动参数拓展服务
- */
- @AutoService(LauncherService.class)
- public class LauncherPropsServiceImpl implements LauncherService {
- @Override
- public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) {
- Properties props = System.getProperties();
- // nacos 通用配置
- PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile));
- PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile));
- PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.nacosNameSpace(profile));
- PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.nacosNameSpace(profile));
- PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.service", appName);
- }
- }

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

我们已经知道了,ServiceLoad的注册需要手动创建注册文件,然而在bladex中发现他是通过在实现类上标注@AutoService注解 ,value属性中填入接口的全限定名这种方式,自动创建的注册文件这里的实现方式,就是通过自定义注解,搭配注解处理器,这个注解在google-auto包中有现成的实现,但是bladex中似乎是自己仿写了一下,估计是为了学习一下注解处理器的运用吧,那么我也就了解一下这个东西
注解处理器的作用就是在代码编译的阶段,对指定注解标注了的类,方法,属性等进行处理,一般用于在编译阶段生成一些代码,著名的lombok插件就是利用这个原理,在编译阶段根据注解生成相应的代码,下面首先了解一下注解处理器的使用:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。