【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>

 

posted @   飞翔在天  阅读(165)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示