SpringBoot之自动装配原理及解读

 更新时间:2026年02月03日 08:43:10   作者:追JAVA的小菜鸟  
Spring Boot自动装配原理:通过@SpringBootApplication、@ComponentScan和@EnableAutoConfiguration注解,扫描主配置类所在包及其子包下的类,并加载符合条件的自动配置类,实现Spring IOC容器的自动配置

SpringBoot自动装配原理

spring支持两种bean的配置方式

基于xml文件和JavaConfig

主启动类上的注解@SpringBootApplication

@SpringBootApplication里有三个重要注解

@SpringBootConfiguration

  • 作用: 声明定义Bean,嵌套了@Component组件

@SpringBootConfiguration源码是@Configuration:表示该类为主配置类,可用来装配bean

@Configuration的源码是@Component:说明Spring的配置类也是Spring的一个组件。

它是JavaConfig形式的基于Spring IOC容器的配置类使用的一种注解。SpringBoot本质上就是一个Spring应用,通过这个注解来加载IOC容器的配置。所以在启动类里面标注了@Configuration,意味着它也是一个IOC容器的配置类

@ComponentScan

  • 作用:扫描主配置类包的所有包下的类,相当于xml配置文件中的context:component-scan。eg:pojo中的User类

@EnableAutoConfiguration(重点!!!)

  • 作用:开启自动装配类

@EnableAutoConfiguration里有两个重要注解

@AutoConfigurationPackage:自动配置包

  • 作用:给Spring容器中导入一个Registrar注册器组件

@AutoConfigurationPackage和@ComponentScan一样,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中,但是区别是

  • @AutoConfigurationPackage扫描@Enitity、@MapperScan等第三方依赖的注解
  • @ComponentScan只扫描@Controller/@Service/@Component/@Repository这些常见注解。所以这两个注解扫描的对象是不一样的。

@Import(AutoConfigurationImportSelector.class)——核心注解

作用:通过import导入第三方提供的bean的配置类:AutoConfigurationImportSelector:给容器中导入组件

该类中有selectImports()方法,调用了getAutoConfigurationEntry()

其下又调用了getCandidateConfigurations()

getCandidateConfigurations()中SpringFactoriesLoader.loadFactoryNames()方法

SpringFactoriesLoader.loadFactoryNames()中传入参数EnableAutoConfiguration.class

作用:扫描所有jar包类路径下的META-INF/spring.factories文件,将扫描到的这些文件包装成properties对象,从properties中获取到EnableAutoConfiguration.class类名对应的值,将这些值添加到容器中,用这些类做自动配置功能

在spring-boot-autoconfigure-.jar包中找到spring.factories文件

其中spring.factories文件是一组组的key=value的形式

key=接口 value=接口实现类(多个,逗号隔开)

以HttpEncodingAutoConfiguration为例解释:

  • @Configuration(proxyBeanMethods = false) 表示该类为配置类
  • @EnableConfigurationProperties(ServerProperties.class) 将配置文件中设置的值与properties中的属性绑定,将组件添加到IOC容器
  • @Conditionalxxx:若满足不同的条件,则配置类中的配置生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = “server.servlet.encoding”, value = “enabled”, matchIfMissing = true)

其中ServerProperties.class中的属性值,可与xx.yaml配置文件绑定并修改 

精髓:根据当前配置类的条件判断配置类是否生效,若生效,则添加各种组件,会从properties类中获取属性,可以在配置文件xxx.yaml中设置属性的值

  • Properties类:封装配置文件的相关属性。
  • AutoConfiguration类:自动配置类,添加到IOC容器中。

SpringFactoriesLoader

作用:从classpath/META-INF/spring.factories文件中,根据key来加载对应的类到spring IOC容器中。

自动装配过程

  • 通过各种注解实现了类与类之间的依赖关系,容器在启动的时候SpringApplication.run(),调用EnableAutoConfigurationImportSelector.class的selectImports方法
  • selectImports方法调用SpringFactoriesLoader.loadFactoryNames方法扫描jar包类路径下的META-INF/spring.factories文件下,获取BeanConfiguration列表
  • loadFactoryNames方法会读取spring.factories中EnableAutoConfiguration.class类名对应的值
  • 根据这些类上的注解判断,若条件满足,则该配置类生效,将配置文件中自己设置的属性值配置到对应的配置类中,最后注入到IOC容器中实现自动配置

总结

SpringBoot启动的时候通过@EnableAutoConfiguration注解找到META-INF/spring.factories文件中的所有自动配置类,并对其加载,这些自动配置类都是以AutoConfiguration结尾来命名的。

它实际上就是一个JavaConfig形式的IOC容器配置类,通过以Properties结尾命名的类中取得在全局配置文件中配置的属性,如server.port。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringCloud-Alibaba-Sentinel服务降级,热点限流,服务熔断

    SpringCloud-Alibaba-Sentinel服务降级,热点限流,服务熔断

    这篇文章主要介绍了SpringCloud-Alibaba-Sentinel服务降级,热点限流,服务熔断,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • jenkins-node节点配置方式解读

    jenkins-node节点配置方式解读

    Jenkins通过主从节点实现分布式构建,支持负载均衡和特定环境任务,配置包括标签匹配、启动方式、环境变量及工具管理,可参数化选择节点执行
    2025-08-08
  • 更简单更高效的Mybatis Plus最新代码生成器AutoGenerator

    更简单更高效的Mybatis Plus最新代码生成器AutoGenerator

    这篇文章主要为大家介绍了更简单更高效的Mybatis Plus最新代码生成器AutoGenerator使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • springboot如何通过注解实现多线程

    springboot如何通过注解实现多线程

    在Spring Boot中实现异步方法时,如果直接在调用类中使用`@Async`注解,可能会导致异步失败,正确的做法是将实现异步的方法放在一个独立的类中,并通过Spring生成的bean来调用这个方法,这样可以成功实现异步
    2024-12-12
  • Java中LinkedList原理代码解析

    Java中LinkedList原理代码解析

    这篇文章主要介绍了Java中LinkedList原理代码解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • SpringBoot AOP处理请求日志打印功能代码实例

    SpringBoot AOP处理请求日志打印功能代码实例

    这篇文章主要介绍了SpringBoot AOP处理请求日志打印功能代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 简单了解Java类成员初始化顺序

    简单了解Java类成员初始化顺序

    这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 关于JDK8中的字符串拼接示例详解

    关于JDK8中的字符串拼接示例详解

    字符串拼接问题应该是每个Java程序员都熟知的事情了,几乎每个Java程序员都读过关于StringBuffer/StringBuilder来拼接字符串。下面这篇文章主要给大家介绍了关于JDK8中的字符串拼接的相关资料,需要的朋友可以参考下。
    2018-04-04
  • RabbitMQ 的消息持久化与 Spring AMQP 的实现详解

    RabbitMQ 的消息持久化与 Spring AMQP 的实现详解

    这篇文章主要介绍了RabbitMQ 的消息持久化与 Spring AMQP 的实现剖析详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • RocketMQ中消费者的消费进度管理

    RocketMQ中消费者的消费进度管理

    这篇文章主要介绍了RocketMQ中消费者的消费进度管理,业务实现消费回调的时候,当且仅当此回调函数返回ConsumeConcurrentlyStatus.CONSUME_SUCCESS ,RocketMQ才会认为这批消息(默认是1条)是消费完成的,需要的朋友可以参考下
    2023-10-10

最新评论