starter的核心即自动装配,通过自动装配原理手动搭建starter。一般构造starter是通过.properties去读取用户配置的信息去构建业务类,或者让用户省去技术的引入配置等。
若是简单依赖第三方jar依赖库,不需要写自动装配配置,则直接写接口或者工具类来生成jar给用户直接调用即可。
从Spring Boot官方提供的Starter的作用来看,Starter组件有如下:
·涉及相关组件的Jar包依赖
·自动实现Bean的装配
·自动声明并且加载application.properties文件中属性配置
1 starter的命名规范
·自定义 starter,工程命名格式为{xxx}-spring-boot-starter。
·官方starter,工程命名格式为spring-boot-starter-{xxx}。
2 创建流程规范
·定义核心业务类,这是该starter存在的意义
·完成自动配置类,目的是完成业务类的实例化
·若核心业务类中需要从配置文件获取配置数据,还需要定义一个用于封装配置文件中相关属性的类
·定义 META-INF/spring.factories 配置文件,用于对自动配置类进行注册。
3案例简介
starter功能介绍
1 默认输出 “no value”
2 接受用户配置的参数,且根据用户输入的配置条件生成不一样的实例
4 创建maven工程
1 引入pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="【国家反诈中心、工信部反诈中心、中国电信联合提醒】"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx</groupId>
<artifactId>example-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<springboot.version>2.0.2.RELEASE</springboot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
-----------------------------------------
//下面是作为工程的测试才引入的,开放jar给第三方则删除引入以及测试代码块,且删除一切启动该项目的配置信息等
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
目录
2 编写业务类 HelloService
@AllArgsConstructor
public class HelloService {
private String name;
public String info(){
return "your info: " + name;
}
}
3 添加属性封装类HelloProperties
/**
* @decription:
* 属性封装类
* * >>要读取配置文件中的"hello.service.adjective"
*/
@ConfigurationProperties("hello.service") //属性前缀
@Data
public class HelloProperties {
private String name;
}
4 配置类WorldServiceAutoConfiguration
@Configuration
@ConditionalOnClass(HelloService.class)
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
@Autowired
private HelloProperties properties;
@Bean
@ConditionalOnProperty(name = "hello.service.enable", havingValue = "true")
public HelloService worldService() {
return new HelloService(properties.getName());
}
@Bean
@ConditionalOnProperty(name = "hello.service.enable", havingValue = "false")
public HelloService worldService1() {
return new HelloService("z");
}
@Bean
@ConditionalOnMissingBean
public HelloService worldService2() {
return new HelloService("vvv");
}
@Bean
public ShareDemo getShareDemo(HelloProperties worldProperties) {
ShareDemo shareDemo = new ShareDemo();
shareDemo.setName(worldProperties.getName());
return shareDemo;
}
}
5 配置类注册spring.factories
在resources目录下新建META-INF/spring.factories文件,添加如下内容
|
6 可以先在该项目下进行测试,新建Test
|
若是要给第三方引用,则可以把application.properties以及单元测试、配置等、多余的pom、Application.java删除,然后验证一下第三方引入情况。
最后,maven打包,一个starter就算定义完成了,打包install后jar里面会多出META-INF/spring-configuration-metadata.json,是spring-boot-configuration-processor帮我们创建的ShareProperties元数据文件,凭借它的介绍,我们可以在application.xml中准确配置使用。
5 新建项目引入该依赖
1 使用idea创建项目,导入spring-boot-starter-web依赖,同时添加我们刚刚定义好的example-spring-boot-starter。
<dependency>
<groupId>com.xxx</groupId>
<artifactId>example-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在application.properties
hello.service.name=ppppaaa hello.service.enable=true
然后在单元测试引入,因为已经被自动化装配,因此可以直接注解引入
@Autowired HelloService worldService;
@Autowired ShareDemo shareDemo;