• SpringBoot 自动装配原理


    早期的Spring项目需要添加需要配置繁琐的xml,比如MVC、事务、数据库连接等繁琐的配置。Spring Boot的出现就无需这些繁琐的配置,因为Spring Boot基于约定大于配置的理念,在项目启动时候,将约定的配置类自动配置到IOC容器里。这些都因为Spring Boot有自动配置的特性。

    Sping Boot 如何实现自动配置

    Spring Boot都需要创建一个mian启动类,而启动类都含有@SpringBootApplication注解,从启动类,一步步探索源码。

    @SpringBootApplication注解

    Spring Boot 启动类上都有一个 @SpringBootApplication注解:

    @EnableAutoConfiguration注解

    @SpringBootApplication 里面有 @EnableAutoConfiguration 的注解:

    AutoConfigurationImportSelector类

    @EnableAutoConfiguration注解导入AutoConfigurationImportSelector类:

    selectImports()方法

    AutoConfigurationImportSelector类找到 selectImports 方法,里面有getAutoConfigurationEntry方法:

    SpringFactoriesLoader.loadFactoryNames() 方法

    getAutoConfigurationEntry方法通过SpringFactoriesLoader.loadFactoryNames() 扫描所有含有META-INF/spring.factoriesjar包:

    spring-boot-autoconfigure-xxx.jar项目包含META-INF/spring.factories文件,spring.factories是一个键值对的形式,扫描该文件下@EnableAutoConfiguration对应类:

    自动配置主要由@EnableAutoConfiguration实现,添加了@EnableAutoConfiguration注解,会导入AutoConfigurationImportSelector类,里面的selectImports方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有含有META-INF/spring.factoriesjar包,将对应key@EnableAutoConfiguration注解全名对应的value类全部装配到IOC容器中。

    Debug 验证

    打开Debug调式模式,在getCandidateConfigurations方法里面的SpringFactoriesLoader.loadFactoryNames()处设置断点,查看返回的configurations集合:

    第一个元素是tk.mybatis.mapper.autoconfigure.MapperAutoConfiguration是因为引入了通用mapper的依赖:

    自动配置原理

    原理流程汇总

    从上面查看的源码,可以知道Spring Boot自动配置主要是@EnableAutoConfiguration实现的,@EnableAutoConfiguration注解导入AutoConfigurationImportSelector类,通过selectImports方法调用SpringFactoriesLoader.loadFactoryNames()扫描所有含有META-INF/spring.factories文件的jar包,将spring.factories文件中@EnableAutoConfiguration对应的类注入到IOC容器中。

    这些属性自动配置到IOC之后就无需自己手动配置bean了,Spring Boot中的约定大于配置理念,约定是将需要的配置以约定的方式添加到IOC容器中。

    自动配置生效条件

    那是不是spring.factories文件对应的配置都会加载到IOC容器中?比如下面的Kafka自动配置类:

    @Configuration
    @ConditionalOnClass(KafkaTemplate.class)
    @EnableConfigurationProperties(KafkaProperties.class)
    @Import({ KafkaAnnotationDrivenConfiguration.class, KafkaStreamsAnnotationDrivenConfiguration.class })
    public class KafkaAutoConfiguration {
    
    	private final KafkaProperties properties;
    
    	private final RecordMessageConverter messageConverter;
    
    	public KafkaAutoConfiguration(KafkaProperties properties, ObjectProvider messageConverter) {
    		this.properties = properties;
    		this.messageConverter = messageConverter.getIfUnique();
    	}
    
    	@Bean
    	@ConditionalOnMissingBean(KafkaTemplate.class)
      public KafkaTemplate kafkaTemplate(ProducerFactory kafkaProducerFactory,
    			ProducerListener kafkaProducerListener) {
          ....
          }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    其中有几个注解:

    @ConditionalOnClass
    @ConditionalOnMissingBean
    
    • 1
    • 2
    • @ConditionalOnClass表示在类路径中存在类才会配置该配置类。只有引入相关依赖才会自动配置该配置类。
    • @ConditionalOnMissingBean表示只有不存在对应的类的bean才会自动配置该类。

    所以spring.factories里面并不是所有的bean都会装配到IOC容器中,只会按需配置对应的bean

    总结

    • Spring Boot自动配置原理
      • 1、@EnableAutoConfiguration注解导入AutoConfigurationImportSelector类。
      • 2、执行selectImports方法调用SpringFactoriesLoader.loadFactoryNames()扫描所有jar下面的对应的META-INF/spring.factories文件.
      • 3、限定为@EnableAutoConfiguration对应的value,将这些装配条件的装配到IOC容器中。
    • 自动装配简单来说就是自动将第三方的组件的bean装载到IOC容器内,不需要再去写bean相关的配置,符合约定大于配置理念。
    • Spring Boot基于约定大于配置的理念,配置如果没有额外的配置的话,就给按照默认的配置使用约定的默认值,按照约定配置到IOC容器中,无需开发人员手动添加配置,加快开发效率。

    文章不错的话,点个赞吧!

    在这里插入图片描述

  • 相关阅读:
    神经网络层次分析模型,神经网络层次分析方法
    Apache HTTP Server 2.4.49 路径穿越漏洞 (CVE-2021-41773)
    MVC和MVVM
    项目进展(十)-解决ADS1285在调试时出现的问题
    怎么压缩图片大小?这些压缩方法值得收藏
    美东一公司的郁闷面试题
    OpenCV 16 - Qt使用opencv视觉库
    LeetCode 82 删除排序链表中的重复元素 II
    c++多态与虚函数从根上解决
    Linux 磁盘空间异常爆满,该怎么查?
  • 原文地址:https://blog.csdn.net/qq_42700121/article/details/127711465