【Spring Boot】自动装配&Starter
自动装配原理:
https://javaguide.cn/system-design/framework/spring/spring-boot-auto-assembly-principles.html
问题:SpringBoot为何使用自动装配而非直接使用@Configuration?
@Configuration要求在自动配置扫描范围下才能生效,默认是SpringBoot启动类所在包或子包范围;如果提供一个组件给其他部门使用,如果每个部门包命令不同的话,就无法确认@Configuration是否在扫描范围内,所以就需要利用自动装配来加载
Spring Boot Starters帮助我们快速继承并使用各种三方件。
一、命名规范
- 官方Starter: 遵循spring-boot-starter*格式,如 spring-boot-starter-data-redis、spring-boot-starter-web
- 非Spring官方: 建议*-spring-boot-starter格式,避免与Spring官方冲突,如nacos-config-spring-boot-starter
二、基本原理
本质是一个Maven项目,作为依赖管理和自动配置的载体。Spring Boot项目中,只需引入相应Starter,就能享受一站式服务,如自动配置和依赖管理
一个Spring Boot Starter主要以下部分组成
1、依赖管理:在Starter的POM文件中,可以了一系列使用该Starter所必需的依赖,如spring-boot-starter-web中包含了 spring-boot-starter-tomcat,spring-webmvc, spring-web等关于web开发的依赖
2、自动配置:AutoConfiguratoin
3、条件注解:@ConditionalXXX
解决 Spring Boot 中不能被默认路径扫描的配置类的方式,有 2 种:
(1)在 Spring Boot 主类上使用 @Import 注解
(2)使用 spring.factories 文件:在springboot运行时,SpringFactoriesLoader 类会去寻找META-INF/spring.factories
三、自定义Spring Boot Starter
比如创建一个发送邮件的Starter,名为 mail-sender-spring-boot-starter
1、新建一个Maven项目,并在pom.xml文件定义我们Starter名称和所需的依赖
<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">
<groupId>com.example</groupId>
<artifactId>mail-sender-spring-boot-starter</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
</dependencies>
</project>
2、需要一个自动配置类,定义一个发送邮件的Bean
@Configuration
@ConditionalOnClass(JavaMailSenderImpl.class)
@ConditionalOnProperty(prefix="spring.mail", name="host")
public class MailSenderAutoConfiguration
{
@Autowired
private MailProperties mailProperties;
@Bean
@ConditionalOnMissingBean
public JavaMailSender mailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(mailProperties.getHost());
mailSender.setPort(mailProperties.getPort());
mailSender.setUserName(mailProperties.getUserName());
mailSender.setPassword(mailProperties.getPassword());
return mailSender;
}
}
在该配置类中 ,
- @ConditionalOnClass 确保只有JavaMailSenderImpl类存在于类路径中,才进行自动配置;
- @ConditionalOnProperty 确保只有当spring.mail.host这个配置存在时,才会进行自动配置;
- @ConditionalOnMissingBean 确保只有当应用中不存在 JavaMailSenderImpl 类型的Bean,才会创建新的Bean
3、我们需要在 resources/META-INF/spring.factories 文件中指定我们的自动配置类
org.springframewok.boot.autoconfigure.EnableAutoConfiguration=com.example.MailSenderAutoConfiguration
4、当其他项目POM添加了我们当前Starter依赖,并在配置文件定义 spring.mail.host等属性后,Spring Boot会自动配置并初始化 JavaMailSenderImpl Bean, 开发者就可以直接使用它来发邮件了。
<dependency>
<groupId>com.example</groupId>
<artifactId>mail-sender-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)