编写自定义的springbootstarter
原理
使用一个公用的starter的时候,只需要将相应的依赖添加的Maven的配置文件当中即可,免去了自己需要引用很多依赖类,并且SpringBoot会自动进行类的自动配置。那么 SpringBoot 是如何知道要实例化哪些类,并进行自动配置的呢?
首先,SpringBoot 在启动时会去依赖的starter包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的Jar包去扫描项目所依赖的Jar包,这类似于 Java 的 SPI 机制。
第二步,根据 spring.factories 配置加载AutoConfigure 类。
最后,根据 @Conditional 注解的条件,进行自动配置并将Bean注入Spring Context 上下文当中。
我们也可以使用 @ImportAutoConfiguration({MyServiceAutoConfiguration.class}) 指定自动配置哪些类。实现
终于到了代码实现的步骤,接下来就开始编码我们自己的SpringBoot-starter。 第一步创建一个SpringBoot 项目,并添加下面两个依赖到pom.xml文件当中 org.springframework.boot spring-boot-configuration-processor true org.springframework.boot spring-boot-autoconfigure
其中 spring-boot-configuration-processor 的作用是编译时生成 spring-configuration-metadata.json ,此文件主要给IDE使用。如当配置此jar相关配置属性在 application.yml ,你可以用ctlr+鼠标左键点击属性名,IDE会跳转到你配置此属性的类中。
我们日常使用的Spring官方的Starter一般采取 spring-boot-starter-{name} 的命名方式,如 spring-boot-starter-web 。
而非官方的Starter,官方建议 artifactId 命名应遵循{name}-spring-boot-starter 的格式。 例如:zdy-spring-boot-starter 。com.zdy zdy-spring-boot-starter 1.0.0-SNAPSHOT jar第二步编写我们的Service类
这里讲一下我们的Starter要实现的功能,很简单,提供一个 Service ,包含一个能够将配置文件中配置的字符串根据传入的字符进行分割的方法String[] split(String separatorChar) 。public class StarterService { private String config; public StarterService(String config) { this.config = config; } public String[] split(String separatorChar) { return StringUtils.split(this.config, separatorChar); } }第三步编写配置文件读取类@ConfigurationProperties("com.service") public class StarterServiceProperties { private String config; public void setConfig(String config) { this.config = config; } public String getConfig() { return config; } } 第四步,编写AutoConfigure类 ,这步是关键点@Configuration @ConditionalOnClass(StarterService.class) @EnableConfigurationProperties(StarterServiceProperties.class) public class StarterAutoConfigure { @Autowired private StarterServiceProperties properties; @Bean @ConditionalOnMissingBean @ConditionalOnProperty(prefix = "com.service", value = "enabled", havingValue = "true") StarterService starterService (){ return new StarterService(properties.getConfig()); } }
解释一下代码中用到的几个注解: @ConditionalOnClass ,当classpath 下发现该类的情况下进行自动配置。@ConditionalOnMissingBean ,当Spring Context 中不存在该Bean 时。@ConditionalOnProperty(prefix = "com.service",value = "enabled",havingValue = "true") ,当配置文件中com.service.enabled=true 时。下面列举SpringBoot中的所有@Conditional注解及作用@ConditionalOnBean:当容器中有指定的Bean的条件下 @ConditionalOnClass:当类路径下有指定的类的条件下 @ConditionalOnExpression:基于SpEL表达式作为判断条件 @ConditionalOnJava:基于JVM版本作为判断条件 @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置 @ConditionalOnMissingBean:当容器中没有指定Bean的情况下 @ConditionalOnMissingClass:当类路径下没有指定的类的条件下 @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下 @ConditionalOnProperty:指定的属性是否有指定的值 @ConditionalOnResource:类路径下是否有指定的资源 @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean @ConditionalOnWebApplication:当前项目是Web项目的条件下 最后一步,在resources/META-INF/下创建spring.factories文件,并添加如下内容:org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autocinfigure.StarterAutoConfigure
至此,我们的一个Starter代码部分就是完成了,下面将项目安装到本地Maven仓库中。 发布
在项目根目录执行 mvn install 进行打包安装。测试
将Starter项目的依赖添加到我们自己的SpringBoot项目中 com.zdy zdy-spring-boot-starter 1.0-SNAPSHOT
在 application.yml 配置文件中添加配置信息:com service enabled: true config: a,b,c
在本地使用 JUnit 进行代码测试@Autowired private StarterService starterService; @Test public void starterTest() { String[] splitArray = starterService.split(","); System.out.println(splitArray); }
好,到这我们的一个自定义Stater就完成了
javaNio初级学习javaNio学习笔记(一)学习参考文档httptutorials。jenkov。comjavanioindex。html什么是javaNiojavaNio是javanewIO。是
续航仅400出头,落地15万元,这车还想卖吗?今年6月份,江淮iEVA50也推出了换电车型,虽说换电车型很好的解决了充电焦虑,但还是有着换电站覆盖率较低的问题。今天小编就和大家聊一聊非换电版的20款江淮iEVA50。外观方面,
不到9万的RS3?1。5TCVT,这台宝骏有点意思宝骏相信大家都很熟悉,其旗下的大多数车型都是靠着实惠的价格和不错的性价比而受到不少消费者的喜爱。今天小编就给大家介绍一款宝骏旗下的SUV20款宝骏RS3。外观方面,该车整体的设计非
为什么你定的OKR,走着走着就变成了KPI?从谷歌刮起的OKR风吹进了中国,随着同样的拥趸者字节跳动的崛起,这股风席卷了诸多企业,许多老板听了管理课之后纷纷效仿,于是呐喊着去KPI,拥抱OKR!KPI已死,OKR怎么立?如何
绩效考核不重要,绩效实现才重要很多老板和HR,走着走着就忘掉了初心。组织发展如此干部管理如此薪酬管理如此,绩效管理亦如此。大家在手段和目的之间左右徘回,开始时有明确的目的,知道考核只是手段,但到最后,手段变成了
动态薪酬如何设计需要注意什么?动态薪酬(DynamicSalary)的背景传统的给薪依据,往往以职位学历工作经历及面试时的商议为主。现在一些企业也在采用绩效薪酬,但由于考核评价体系不健全,致使绩效薪酬背离了初衷
华为任职资格体系,不服不行在用人这件事上,任正非曾共开表态对于华为来说,我们要的是战士,而不是完美的苍蝇。所谓人才,不是十全十美,能够满足各种需求的人,而是真正的能上战场的人。华为的18万奋斗者,造就了今天
励志,看看这台保时捷718,车主是怎么实现自己人生的dreamcar施工车型保时捷718Boxster车身颜色竞速黄施工项目威固v10系列隐形车衣顶级威固前挡vk70侧后k35窗膜对于很多汽车粉丝来说,保时捷的招牌一直有着独特的韵味,旗下各款有着截
随机红包算法(java)随机红包算法,每个人都有自己的实现思路。packagecom。jmmq。load。jim。algorithmimportjava。math。BigDecimalimportjava
javaNIO学习笔记(三)javaNIO学习笔记(三)JavaNIOBuffer缓冲区,可以通过channel将数据写入缓冲区,也可以从通道中读取数据到缓冲区缓冲区本质上是一个内存块,您可以将数据写入其中,
javaNIO学习笔记(二)javaNIO学习笔记(二)参考文档httptutorials。jenkov。comjavaniochannels。htmlJavaNIOChannel和传统的IO中的InputS