八、Spring Boot 实现一个自定义start
starter的作用
用来做依赖导入、自动配置
Starter 的核心就是条件注解 @Conditional
当 classpath 下存在某一个 Class 时,某个配置才会生效
实现:
1.新建一个maven项目添加Starter 的自动化配置类:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
2.创建一个 HelloProperties 类,用来接受 application.properties 中注入的值
@ConfigurationProperties(prefix = "javaboy")
public class HelloProperties {
private static final String DEFAULT_NAME = "江南一点雨";
private static final String DEFAULT_MSG = "牧码小子";
private String name = DEFAULT_NAME;
private String msg = DEFAULT_MSG;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
3.新建一个service方法
public class HelloService {
private String msg;
private String name;
public String sayHello() {
return name + " say " + msg + " !";
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4.定义自动化配置类
@Configuration //明这是一个配置类
@EnableConfigurationProperties(HelloProperties.class) // 使@ConfigurationProperties 生效
@ConditionalOnClass(HelloService.class) // 当项目当前 classpath 下存在 HelloService 时,后面的配置才生效
public class HelloServiceAutoConfiguration {
@Autowired
HelloProperties helloProperties;
@Bean
HelloService helloService() {
HelloService helloService = new HelloService();
helloService.setName(helloProperties.getName());
helloService.setMsg(helloProperties.getMsg());
return helloService;
}
}
- 新增 spring.factories 文件
在Maven 项目的 resources 目录下创建一个名为 META-INF 的文件夹,然后在文件夹中创建一个名为 spring.factories 的文件,文件内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.javaboy.mystarter.HelloServiceAutoConfiguration
添加 spring.factories 文件的原因:
从项目启动的加载过程分析,Spring Boot 项目的启动类都有一个 @SpringBootApplication 注解,这个注解是一个组合注解,其中的一个组合项就是 @EnableAutoConfiguration
@EnableAutoConfiguration 表示启用 Spring 应用程序上下文的自动配置,该注解会自动导入一个名为 AutoConfigurationImportSelector 的类,而这个类会去读取一个名为 spring.factories 的文件, spring.factories 中则定义需要加载的自动化配置类,
我们打开任意一个框架的 Starter ,都能看到它有一个 spring.factories 文件