(一)Starter简介
SpringBoot 中的 Starter 是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进 Starter ,应用者只需要在maven中引入Starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。
Starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot 会自动通过 classpath 路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研发各种场景的 spring-boot-starter 依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循==“约定大于配置”==的理念。
在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些可独立于业务代码之外的功配置模块封装成一个个 Starter,复用的时候只需要将其在pom中引用依赖即可,SpringBoot为我们完成自动装配。
(二)创建自定义启动器
1、命名要求
SpringBoot 提供的 starter 以
spring-boot-starter-xxx
的方式命名的。官方建议自定义的 starter 使用
xxx-spring-boot-starter
命名规则。以区分 SpringBoot 生态提供的 starter。
2、自定义启动器
2.1 创建自定义Starter
2.1.1 新建 Maven 工程,按照官方命名要求命名,例如:demo-spring-boot-starter
2.1.2 导入自动配置依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 当前启动器的坐标地址,其他项目可以通过该坐标引入该启动器 -->
<groupId>com.soft</groupId>
<artifactId>diy-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 导入自动配置依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.4</version>
</dependency>
</dependencies>
</project>
2.1.3 编写对外使用对象
对外使用对象是自定义启动对对外暴露的对象,通过该对象可以完成某些需求
// 开启自动配置,使用 @ConfigurationProperties 时必须添加该注解
@EnableAutoConfiguration
// 属性赋值配置
@ConfigurationProperties(prefix = "diy")
public class DiyEntity {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "DiyEntity{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
2.1.4 编写自动注入配置类
对外使用对象必须要有实例才能调用其功能。因为 SpringBoot 不推荐使用 xml 配置文件形式向容器注入对象,所以这里需要使用配置类向 Spring 容器中注入对象。
// 该注解标识当前类是一个配置类,配置类被加载时,@Bean 修饰的方法的返回值会自动注入到 Spring 容器中
@Configuration
public class DiyAutoConfiguration {
// 将方法的返回值注入到 Spring 容器中
@Bean
public DiyEntity diyEntity(){
return new DiyEntity();
}
}
2.1.5 在resources 目录下创建 /META-INF/
目录,并创建 spring.factories
文件
# SpringBoot 启动时会读取所有依赖下 /META-INF/spring.factories 文件,并根据 org.springframework.boot.autoconfigure.EnableAutoConfiguration 关键字获取对应配置类的全限定名称,依此来自动注入对象
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.soft.config.DiyAutoConfiguration
2.2 测试自定义启动器
2.2.1 在 SpringBoot 项目中添加自定义启动器依赖
<dependency>
<groupId>com.soft</groupId>
<artifactId>diy-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2.2.2 注入自定义启动器暴露的对外对象
@Controller
@RequestMapping("/diy")
public class StudentController {
// 注入自定义启动器暴露的对外对象
@Resource
DiyEntity diyEntity;
@GetMapping("/")
public String testDiyStarter(){
System.out.println(diyEntity);
}
}
2.2.3 通过配置文件给属性赋值
diy:
id: 123
name: tom
2.3 自定义启动器启动注解
通过以上配置即可完成自定义 Starter 的使用。在 SpringBoot 启动时自动注入对象,可直接使用。但,并不是所有的 Starter 都需要在 SpringBoot 启动后能直接使用,例如:定时任务、事务等启动器,在需要时开启。
2.3.1 创建标记类
标记类用于标识当前 Starter 是否需要被开启,仅仅是一个标记的作用,所以只需要定义类即可,也可以根据需求编写对应代码。
public class DiyConfigurationSelector{
}
2.3.2 创建开关注解
开关注解是写在 SpringBoot 启动类上,用于管理 Starter 的功能是否可用。
只管导入标记类,当前启动器是否可用它不管。
// Java元注解,标识当前注解使用的对象
@Target({ElementType.TYPE})
// Java元注解,标识当前注解使用的作用周期
@Retention(RetentionPolicy.RUNTIME)
// 导入标记类 DiyConfigurationSelector ,当 Spring 容器中该标记类对象时,即表示开启Starter
@Import(DiyConfigurationSelector.class)
public @interface EnableDiyServer {
}
2.3.3 改造自动注入配置类
条件注解,Spring 容器中有 DiyConfigurationSelector 实例时(标记类) 才会启用 Starter
@ConditionalOnBean(DiyConfigurationSelector.class)
它管的是 Starter 起不起作用
// 该注解标识当前类是一个配置类,配置类被加载时,@Bean 修饰的方法的返回值会自动注入到 Spring 容器中
@Configuration
// 条件注解,Spring 容器中有 DiyConfigurationSelector 实例时(标记类) 才会启用 Starter
@ConditionalOnBean(DiyConfigurationSelector.class)
public class DiyAutoConfiguration {
// 将方法的返回值注入到 Spring 容器中
@Bean
public DiyEntity diyEntity(){
return new DiyEntity();
}
}
2.3.4 SpingBoot 启动类添加开关注解
@SpringBootApplication
@EnableDiyServer // 自定义启动器开关注解
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}