从0到1编写一个Spring Boot Starter
前言
使用过Spring框架的伙伴都知道,虽然Spring在一定程度上帮助我们简化了集成其他框架,但在集成框架的同时仍少不了大量的XML配置,这些繁琐的工作无疑会加重我们的工作任务。而Spring Boot相较于Spring的一个突出优势即为简化了大量繁琐的配置,采用约定大于配置原则,让程序员将更多的精力花费在业务上。
在一个基于Spring Boot搭建的Web项目中,我们常常使用spring-boot-starter-web
这么一个启动器,它内部包含了Tomcat服务器和Spring MVC的相关功能及配置,我们可以直接使用其功能而不需要进行重复的默认配置。那么Spring Boot是如何实现这一功能的呢?
在理解其原理前,我们先来自己编写一个启动器~
第一步:创建Maven项目,添加必要的依赖
<dependencies><!-- 必要依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.7.0</version></dependency><!-- 配置元数据生成 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>2.7.0</version><optional>true</optional></dependency>
</dependencies>
第二步:编写application.properties配置文件
demo.enabled=true
demo.name=hubery
demo.age=18
第三步:编写配置文件读取类
@ConfigurationProperties(prefix = "demo")
public class DemoProperties {private boolean enabled;private String name;private Integer age;// getters and setters...@Overridepublic String toString() {return "DemoProperties{" +"enabled=" + enabled +", name='" + name + '\'' +", age=" + age +'}';}
}
第四步:编写核心业务类
public class DemoService {private final DemoProperties properties;public DemoService(DemoProperties properties) {this.properties = properties;}public String getUserInfo() {return properties.toString();}
}
第五步:编写自动配置类
@Configuration
@EnableConfigurationProperties(DemoProperties.class)
@ConditionalOnClass(DemoService.class) // 当类路径存在该类时生效
@ConditionalOnProperty(prefix = "demo", value = "enabled", matchIfMissing = true)
public class DemoAutoConfiguration {@Bean@ConditionalOnMissingBean // 用户未自定义Bean时生效public DemoService demoService(DemoProperties properties) {return new DemoService(properties);}
}
第六步:注册自动配置类
对于Spring Boot 2.7以前的版本:
在resources/META-INF
下创建spring.factories
文件:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autoconfigure.DemoAutoConfiguration
对于Spring Boot 2.7+版本:
在META-INF/spring
下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件:
com.example.autoconfigure.DemoAutoConfiguration
第七步:打包并安装
在项目根目录下执行命令:
mvn clean install
第八步:测试
新建一个Spring Boot项目,添加刚刚创建的依赖:
<dependency><groupId>com.example</groupId><artifactId>spring-boot-starter-demo</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
Spring Boot 自动装配核心原理
1. 启动入口
@SpringBootApplication
复合注解包含:
@SpringBootConfiguration
@EnableAutoConfiguration // 核心开关
@ComponentScan
2. @EnableAutoConfiguration
工作机制
-
收集阶段:
- 通过
AutoConfigurationImportSelector
扫描所有依赖的:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(新)META-INF/spring.factories
(旧,兼容)
- 合并所有声明的自动配置类
- 通过
-
过滤阶段:
- 通过
@Conditional
系列注解进行条件筛选:@ConditionalOnClass // 类路径存在指定类时生效 @ConditionalOnMissingBean // 容器中不存在指定Bean时生效 @ConditionalOnProperty // 配置属性匹配时生效
- 使用
AutoConfigurationImportFilter
进行最终过滤
- 通过
-
注册阶段:
- 对符合条件的配置类进行排序(
@AutoConfigureOrder
) - 按顺序注册到Spring容器
- 对符合条件的配置类进行排序(
3. 现代版本的变化(Spring Boot 2.7+)
特性 | 旧方式 | 新方式 |
---|---|---|
声明文件 | META-INF/spring.factories | META-INF/spring/AutoConfiguration.imports |
键名 | EnableAutoConfiguration | 无键名(每行一个全限定类名) |
排序控制 | 通过文件顺序 | @AutoConfigureBefore/After |
如果觉得以上内容对您有帮助的话麻烦点一点小心心啦~