SpringBoot——自动装配原理

本文详细介绍了Spring Boot的自动配置原理,包括pom.xml配置、启动器使用、主程序注解及自动配置流程。通过分析Spring Boot如何实现依赖管理、自动配置及组件扫描,帮助读者理解其核心机制。

自动配置

pom.xml

  • SpringBoot-dependencies:核心依赖在父工程中
  • 在引入一些SpringBoot依赖的时候,不需要指定版本,因为有版本的仓库
    在这里插入图片描述

启动器

  • SpringBoot的启动场景,比如下面就使用了spring-boot-starter-web,就会帮我们自动导入web环境所有的依赖
  • SpringBoot会将所有的功能场景,都变成一个一个的启动器
  • 我们要使用什么功能,就只需要找到对应的启动器就可以

在这里插入图片描述

 <dependencies>
        <dependency>
            <!--启动器-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

在这里插入图片描述

主程序

//标注这个类是一个Springboot的应用
@SpringBootApplication
public class SpringBootStudyApplication {
        //将SpringBoot应用启动,利用反射
    public static void main(String[] args) {
        SpringApplication.run(SpringBootStudyApplication.class, args);
    }
}

注解

在这里插入图片描述

@SpringBootConfiguration  spring boot的配置  由外到内
    @Configuration spring配置类
         @Component 说明这也是一个spring的组件

@EnableAutoConfiguration   自动配置
     @AutoConfigurationPackage 自动配置包
         @Import({Registrar.class})  导入选择器 元数据包注册
     @Import({AutoConfigurationImportSelector.class})自动导入选择
           List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

获得候选的配置

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

META-INF/spring.factories :自动配置的核心文件
在这里插入图片描述
在这里插入图片描述

流程

在这里插入图片描述

结论

springboot所有自动配置都是在启动的时候扫描并加载: spring.factories 所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功!

流程

1. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
3. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并自动配置好这些组件,利用@Configuration ;
5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作

启动

在这里插入图片描述
SpringApplication.run
该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;

SpringApplication
这个类主要做了以下四件事情:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
在这里插入图片描述
在这里插入图片描述

### Spring Boot 自动装配原理解析 Spring Boot自动装配功能是其核心特性之一,它极大地简化了开发者的配置工作。以下是关于 Spring Boot 自动装配原理的详细解析: #### 1. **Starter 启动器** Spring Boot 提供了一系列场景化的 Starter 启动器,这些启动器封装了特定技术栈所需的依赖项和默认配置。例如 `spring-boot-starter-web` 就包含了构建 Web 应用所需的核心库[^1]。 当开发者引入某个 Starter 启动器时,Spring Boot 会基于项目的依赖关系以及运行环境中的条件,决定加载哪些组件和服务。这种设计使得开发者无需手动管理复杂的依赖树。 --- #### 2. **SpringFactoriesLoader 加载机制** Spring Boot 使用 `SpringFactoriesLoader` 来加载扩展点。具体来说,`META-INF/spring.factories` 文件中定义了一些 key-value 对应的关系,其中 value 是一组类名列表。Spring Boot 会在应用启动阶段读取该文件,并将指定的类实例化后注册到 Spring 容器中[^2]。 这一过程的关键在于通过 SPI(Service Provider Interface)机制动态发现并加载扩展点,从而实现了高度可插拔的功能模块支持。 --- #### 3. **AutoConfigurationImportSelector 类的作用** `AutoConfigurationImportSelector` 是 Spring Boot 实现自动装配的重要入口。它的主要职责是扫描项目中可用的自动配置类,并将其加入到 Spring 容器中。这一步骤由 `selectImports()` 方法完成,返回一个需要导入的候选类集合[^3]。 具体的筛选逻辑如下: - 利用 `@EnableAutoConfiguration` 注解触发整个流程。 - 结合 `spring-boot-autoconfigure` 模块中的元数据文件 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 找到所有可能适用的自动配置类。 - 根据上下文中实际存在的 Bean 和其他条件判断是否启用某一项配置。 --- #### 4. **Condition 接口与条件匹配** 为了确保只加载必要的配置而不会造成冲突或冗余,Spring Boot 设计了一套灵活的条件评估体系——即 Condition 接口及其子接口家族。常见的实现有: - `@ConditionalOnClass`: 当某些类存在于 classpath 上时生效。 - `@ConditionalOnMissingBean`: 如果容器中不存在某种类型的 Bean,则创建一个新的。 - `@ConditionalOnProperty`: 根据配置属性值控制行为。 这些条件注解被广泛应用于各个自动配置类之上,只有满足对应约束才会执行相应操作。 --- #### 5. **总结** 综上所述,Spring Boot自动装配是一个复杂但优雅的过程,涉及多个关键技术环节: - Starter 启动器提供基础框架; - SpringFactoriesLoader 动态加载扩展点; - AutoConfigurationImportSelector 负责挑选合适的配置类; - Conditions 系统保障精准适配。 掌握以上知识点不仅有助于深入理解 Spring Boot 工作方式,在面对面试官提问时也能展现扎实的技术功底。 ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 上述代码片段展示了如何快速搭建一个具备自动装配能力的应用程序。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值