starter是什么?
springboot作为当前最热门的企业级开发框架,其最为重要的一个特性就是约定大于配置。springboot去掉了spring开发中繁琐的配置文件,同时内置了tomcat等,大大提升了开发的效率。约定大于配置的一个具体的实现方式,就是引入了starter机制。
如果你有留意过maven依赖,那么在你的项目中肯定看到过starter结尾的jar包。正式因为这些jar包存在,才能让我们更加专业于业务开发。
为什么要自定义starter?
在我们的日常开发工作中,经常会有一些独立于业务之外的模块。为了更好更快的集成这些模块,也为了展现我们强大的封装能力,这个时候就需要封装成starter。使用者只需要引入pom依赖,通过配置项就可以轻松的使用了。
自定义starter
pom.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:///POM/4.0.0 https:///xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xiaoama</groupId>
<artifactId>spring-boot-starter-xiaoama</artifactId>
<version>0.4-SNAPSHOT</version>
<name>starter</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
新建配置类XiaoAMaConfiguration
@Configuration
@EnableConfigurationProperties(XiaoAMaProperties.class)
@ConditionalOnProperty(prefix = "xiaoama.auto.config",name = "enable",havingValue = "true")
public class XiaoAMaConfiguration {
@Resource
private XiaoAMaProperties xiaoAMaProperties;
@Bean
@ConditionalOnMissingBean(Xiao.class)
public Xiao xiao(){
System.out.println("==========读取配置文件==========");
System.out.println(xiaoAMaProperties.toString());
System.out.println("=========读取配置文件结束========");
return new Xiao();
}
}
@ConditionalOnXXX是spring官方提供的一系列的配置类注解,位于springframework-boot-autoconfigure包下,只用是用于控制bean的生成规则。感兴趣的同学可以去看官方源码,这里只给大家介绍下用到的2种Conditional注解。
@ConditionalOnProperty:依据配置文件的内容作为条件,判断生成bean的类型。
(
prefix:配置文件的前缀
name:属性值名称
havingValue:赋值内容
)
当配置文件满足特定的条件后,就会触发构建对应的bean。
@ConditionalOnMissingBean:spring容器中缺省了某个类才会触发构建对应的bean。
新建实体类Xiao
public class Xiao {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public String toJson(){
return "\""+name+"\"";
}
}
新建配置文件XiaoAMaProperties
@ConfigurationProperties(prefix = "xiaoama.auto.config")
public class XiaoAMaProperties {
String enable;
String name;
String type;
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getEnable() {
return enable;
}
public void setEnable(String enable) {
this.enable = enable;
}
@Override
public String toString() {
return "XiaoAMaProperties{" +
"enable='" + enable + '\'' +
", name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
}
通过@ConfigurationProperties注解注入属性值,@ConfigurationProperties 相当于是多个@Value注解的集合,只需要配置前缀名prefix,属性会根据命名规则自动匹配注入。
新建完成对应的类后,在resources目录下新建/META-INF目录,并在/META-INF目录下新建spring.factories文件。
将我们的XiaoAMaConfiguration添加到EnableAutoConfiguration下,让spring自动配置能扫描到我们的配置类。
spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xiaoama.starter.config.XiaoAMaConfiguration
到这里,作为一个自定义的starter的主要流程就已经全部配置完了。但是为了更加便利使用,这里我们还需要新增一个spring-configuration-metadata.json文件。spring-configuration-metadata.json文件的作用是作为spring配置的元数据,也就是在我们引入配置信息的时候能只能读取关联,如下图所示
spring-configuration-metadata.json
{
"properties": [
{
"name": "xiaoama.auto.config.enable",
"description": "是否启用小阿码自动装配",
"type": "java.lang.Boolean"
},
{
"name": "xiaoama.auto.config.name",
"description": "小阿码名字",
"type": "java.lang.String"
},
{
"name": "xiaoama.auto.config.type",
"description": "小阿码类型",
"type": "java.lang.String"
}
]
}
配置完成后,执行mvn clean install,把我们的starter推到maven私库中。然后在别的项目中引入我们的starter依赖:
<dependency>
<groupId>com.xiaoama</groupId>
<artifactId>spring-boot-starter-xiaoama</artifactId>
<version>0.4-SNAPSHOT</version>
</dependency>
在boostrap.xml中新增配置信息:
xiaoama:
auto:
config:
enable: true
name: xiaoama
type: boy
启动工程,在启动日志中就能看到打印信息,表明我们的bean已经成功的注册到spring容器当中:
2021-03-08 17:34:44.623 [restartedMain] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1517 ms
==========读取配置文件==========
XiaoAMaProperties{enable='true', name='xiaoama', type='boy'}
=========读取配置文件结束========
2021-03-08 17:34:45.162 [restartedMain] INFO o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'