SpringBoot自定义starter 学习背景 最近和同事在开发一个叫做数据准备的项目,用到了SpringBoot(ps:之前的项目用的是ssm,第一次正式使用SpringBoot),现在对于这种开箱即用的SpringBoot-Starter感到无比的惊叹,需要使用某个中间件,只需引入然后附加少许配置即可投入生产。今天就开始学习一下SpringBoot的starter的开发规范。
Starter的构成 1、命名 创建一个工程叫做Flyway-spring-boot-starter
Spring 官方对 starter 的命名是有规范的,只有官方提供的 starter, 才能命名为 spring-boot-starter-{name}, 比如 spring-boot-starter-web; 而对于非官方的,需以 {name}-spring-boot-starter 的格式命名。
2、增加Spring-Boot-AutoConfiguration依赖 1 2 3 4 5 6 <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-autoconfigure</artifactId > </dependency >
3、新增自动配置类 创建类 FlyWayAutoConfiguration 来实现自动配置化功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package com.yidan.flyway;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration @ConditionalOnClass(SelfService.class) @EnableConfigurationProperties(SelfProperties.class) public class FlyWayAutoConfiguration { @Bean @ConditionalOnMissingBean public SelfService selfService () { return new SelfService(); } }
接下来,对上面相关注解说明一下: @Configuration: 标注类为一个配置类,让 spring 去扫描它; @ConditionalOnClass:条件注解,只有在 classpath 路径下存在指定 class 文件时,才会实例化 Bean; @EnableConfigurationProperties:使指定配置类生效; @Bean: 创建一个实例类注入到 Spring Ioc 容器中; @ConditionalOnMissingBean:条件注解,意思是,仅当 Ioc 容器不存在指定类型的 Bean 时,才会创建 Bean。
4、自定义配置类及功能实现 创建自定义配置类 SelfProperties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package com.yidan.flyway;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "flyway.self") public class SelfProperties { private String message = "hello flyway" ; public String getMessage () { return message; } public void setMessage (String message) { this .message = message; } }
创建SelfService业务方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package com.yidan.flyway;import javax.annotation.Resource;public class SelfService { @Resource private SelfProperties selfProperties; public String message () { return selfProperties.getMessage(); } }
5、创建spring.factories文件 在resource目录下创建META-INF目录,在该目录下创建spring.factories文件。 Spring Boot 会在启动时,自动会去查找指定文件 /META-INF/spring.factories,若有,就会根据配置的类的全路径去自动化配置。
1 org.springframework.boot.autoconfigure.EnableAutoConfiguration =com.yidan.flyway.FlywayAutoConfiguration
6、自定义的配置信息元数据描述 我们在开发SpringBoot的项目时,在写application.properties(或application.yml)时,IDEA会自动智能提醒,key和value的值。它是如何做到的呢?在Spring的官方文档中有相对应的介绍SpringBoot自定义配置详解
在Resourse目录下的META-INF 创建:spring-configuration-metadata.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 { "groups" : [ { "sourceType" : "com.yidan.flyway.SelfProperties" , "type" : "com.yidan.flyway.SelfProperties" , "name" : "flyway.self" } ], "hints" : [ { "name" : "flyway.self.message" , "values" : [ { "value" :"hello flyway" , "description" : "第一个值" }, { "value" : "hello configuration" , "description" : "第二个值" } ], "providers" : [ { "name" : "flyway starter" , "parameters" : "123" } ] } ], "properties" : [ { "name" : "flyway.self.message" , "type" : "java.lang.String" , "description" : "自定义的配置" , "sourceType" : "com.yidan.flyway.SelfProperties" , "defaultValue" : "hello flyway" , "deprecation" : { "level" : "warning" , "reason" : "测试忽略理由" , "replacement" : "hello configuration" } } ] }
项目使用 引入依赖:
1 2 3 4 5 <dependency > <groupId > com.yidan</groupId > <artifactId > flyway-spring-boot-starter</artifactId > <version > ${project.version}</version > </dependency >
使用我们自动装配的bean: SelfService, 修改配置文件中:flyway.self.message=hello configuration (此时IDEA会自动提示我们自定义的key,甚至有值的推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.yidan.passport;import com.yidan.flyway.SelfService;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController public class TestController { @Resource private SelfService selfService; @GetMapping("/get") public String message () { return selfService.message(); } }
测试:
1 2 $ curl http://localhost:6002/get hello configuration
完,后续遇到再做补充!!!