SpringBoot通过SpringBoot Starter零配置自动加载第三方模块,只需要引入模块的jar包不需要任何配置就可以启用模块,遵循约定大于配置的思想 。那么如何编写一个SpringBoot Starter呢?我们需要考虑如下几个问题:
- 如何让SpringBoot发现我们编写的模块?
- 如何让模块读取SpringBoot的配置文件?
- 如果用户没有在配置文件中配置必要的配置项,如何默认禁用模块?
- 如何让SpringBoot知道模块有哪些配置项目,方便用户配置配置文件?
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.alibaba.arthas.spring.ArthasConfiguration,\com.alibaba.arthas.spring.endpoints.ArthasEndPointAutoConfiguration
这样SpringBoot在启动的时候就会自动加载这些类存放到容器中管理 。
二.模块读取SpringBoot的配置文件ArthasConfiguration的源码:
@ConditionalOnProperty(name = {"spring.arthas.enabled"},matchIfMissing = true)@EnableConfigurationProperties({ArthasProperties.class})public class ArthasConfiguration {@ConfigurationProperties(prefix = "arthas")@ConditionalOnMissingBean(name = {"arthasConfigMap"})@Beanpublic HashMap<String, String> arthasConfigMap() {return new HashMap();}@ConditionalOnMissingBean@Beanpublic ArthasAgent arthasAgent(@Autowired @Qualifier("arthasConfigMap") Map<String, String> arthasConfigMap, @Autowired ArthasProperties arthasProperties) throws Throwable {arthasConfigMap = StringUtils.removeDashKey(arthasConfigMap);ArthasProperties.updateArthasConfigMapDefaultValue(arthasConfigMap);String appName = this.environment.getProperty("spring.application.name");if (arthasConfigMap.get("appName") == null && appName != null) {arthasConfigMap.put("appName", appName);}Map<String, String> mapWithPrefix = new HashMap(arthasConfigMap.size());Iterator var5 = arthasConfigMap.entrySet().iterator();while(var5.hasNext()) {Map.Entry<String, String> entry = (Map.Entry)var5.next();mapWithPrefix.put("arthas." + (String)entry.getKey(), entry.getValue());}ArthasAgent arthasAgent = new ArthasAgent(mapWithPrefix, arthasProperties.getHome(), arthasProperties.isSlientInit(), (Instrumentation)null);arthasAgent.init();logger.info("Arthas agent start success.");return arthasAgent;}}
我们发现类上面两个注解EnableConfigurationProperties和ConditionalOnProperty 。这两个注解的作用如下:- EnableConfigurationProperties用来指定要加载的配置类 , 配置类用来加载SpringBoot的配置文件,SpringBoot配置文件中可以指定Arthas的启动参数 。如果你不需要任何参数,则可以不指定EnableConfigurationProperties 。
@ConfigurationProperties(prefix = "arthas")public class ArthasProperties {private String ip;private int telnetPort;private int httpPort;private String tunnelServer;private String agentId;private String appName;private String statUrl;}
- ConditionalOnProperty通过读取SpringBoot配置文件的指定参数判断是否启用组件,如果判断为False,ArthasConfiguration里的Bean就不会被加载到容器中,即组件的开关 。Arthas读取spring.arthas.enabled来判断是否加载组件 。如果你想默认启动 , 没有开关,则可以不指定ConditionalOnProperty 。
3.1创建一个SpringBootStarter项目3.1.1 新建项目 , 选择使用Maven构建 。
文章插图
3.1.2 然后创建spring.factories文件和配置类 。
文章插图
3.1.3 spring.factories写入配置类的全称 。org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.bjgoodwil.SpringBootStarterConfiguration
3.1.4 Maven打包使用Maven的site命令打包jar到自己的本地仓库中 。
3.2在SpringBoot项目中引入jar打开一个SpringBoot项目,在pom文件中引入Jar(直接拷贝Starter pom文件中的参数),启动SpringBoot项目,控制台就会打印配置类的打印语句 。
<!--自定义Starter--><dependency><groupId>com.bjgoodwill</groupId><artifactId>springbootstarter</artifactId><version>1.0-SNAPSHOT</version></dependency>
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SpringBoot自定义注解+异步+观察者模式实现业务日志保存
- 装配 SpringBoot自动配置流程
- Springboot 一行代码实现文件上传 20个平台!少写代码到极致
- SpringBoot内置工具类,告别瞎写工具类了
- 之四 2流高手速成记:SpringBoot整合redis及mongodb
- Springboot JSON 转换:Jackson篇
- SpringBoot整合ES+Kibana
- SpringBoot框架SpEL表达式注入漏洞复现与原理分析
- 手写自定义springboot-starter,感受框架的魅力和原理
- 一 JPA入门学习集合springboot