我们在使用springboot的时候,感觉特别的方便易用。原因就是springboot官方提供了很多starter,我们需要使用什么功能,只需要引入对应的starter就可以了,大大简化了配置,这就是springboot当中约定大于配置特性。
那么这些starter到底是如何工作的呢?下面我们来自建一个自己的springboot starter,从而对里面的特性一探究竟。
项目名称
spring官方的starter的名称一般都是下面的格式:spring-boot-starter-xxxxx,例如spring-boot-starter-actuator、spring-boot-starter-web
而非官方的starter官方建议命名为:xxxxx-spring-boot-starter,所以新建一个springboot工程,命名这个工程为:userdefined-spring-boot-starter
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/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.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fsl</groupId>
<artifactId>userdefined-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>userdefined-spring-boot-starter</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging><!-- 必须有这个设置,否则无法执行maven install打包到maven仓库供别人引用 -->
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- starter的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
自定义的配置属性
@ConfigurationProperties("my.defined")
public class MyDefinedProperties {
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 家乡地址
*/
private String hometown;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getHometown() {
return hometown;
}
public void setHometown(String hometown) {
this.hometown = hometown;
}
@Override
public String toString() {
return "MyDefinedProperties{" +
"name='" + name + '\'' +
", age=" + age +
", hometown='" + hometown + '\'' +
'}';
}
}
自定义的service
public class MyDefinedService {
MyDefinedProperties myDefinedProperties;
public MyDefinedProperties getMyDefinedProperties() {
return myDefinedProperties;
}
public void setMyDefinedProperties(MyDefinedProperties helloProperties) {
this.myDefinedProperties = helloProperties;
}
public String sayHello() {
return String.format("[name=%s, age=%d, hometown=%s]",
myDefinedProperties.getName(),
myDefinedProperties.getAge(),
myDefinedProperties.getHometown());
}
}
加载service
@Configuration
//web工程生效
@ConditionalOnWebApplication
@EnableConfigurationProperties(MyDefinedProperties.class)
public class MyDefinedServiceAutoConfiguration {
@Autowired
MyDefinedProperties myDefinedProperties;
@Bean
@ConditionalOnMissingBean(MyDefinedService.class)
@ConditionalOnProperty//存在对应配置信息时初始化该配置类
(
prefix = "my.defined",//存在配置前缀my.defined
name = "enabled",
havingValue = "true",//开启
matchIfMissing = true//缺失检查
)
public MyDefinedService myDefinedService2() {
MyDefinedService service = new MyDefinedService();
service.setMyDefinedProperties(myDefinedProperties);
return service;
}
}
配置启动类
在resources目录下面,新建META-INF文件夹,里面建立spring.factories文件,文件内容如下:
#配置自定义Starter的自动化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.fsl.userdefinedspringbootstarter.MyDefinedServiceAutoConfiguration
执行maven insatll打包命令
项目的整体结构如下:
执行maven install命令打包项目
别的项目引用这个starter
在另外的工程当中引入对应的依赖
<!--引入自定义的starter-->
<dependency>
<groupId>com.fsl</groupId>
<artifactId>userdefined-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
配置属性
#设置自定义starter的参数
my.defined.name=ydd
my.defined.age=18
my.defined.hometown=jiangxi
my.defined.enabled = true
可以直接注入上面的service
@RestController
public class IndexController {
@Autowired
private MyDefinedService myDefinedService;
@GetMapping("/index")
public String index(){
return myDefinedService.sayHello();
}
}
运行结果