• SpringBoot自动装配原理及分析


    一、什么是自动装配

    在使用SpringBoot的时候,会自动将Bean装配到IoC容器中。例如我们在使用Redis数据库的时候,会引入依赖spring-boot-starter-data-redis。在引入这个依赖后,服务初始化的时候,会将操作Redis需要的组件注入到IoC容器中进行后续使用

    自动装配大致过程如下:

    获取到组件(例如spring-boot-starter-data-redis)META-INF文件夹下的spring.factories文件

    spring.factories文件中列出需要注入IoC容器的类

    将实体类注入到IoC容器中进行使用

    二、自动装配原理

    自动装配大致流程是通过@SpringBootApplication进行实现,这个注解声明在SpringBoot的启动类上

    1、SpringBoot启动类

    2、@SpringBootApplication注解

    SpringBoot启动类=>@SpringBootApplication

    3、@SpringBootConfiguration注解

    SpringBoot启动类=>@SpringBootApplication=>@SpringBootConfiguration

    通过@SpringBootConfiguration注解标识SpringBootApplication是一个SpringBoot配置类

    @AliasFor注解用于为注解属性声明别名(@SpringBootApplication注解也有@AliasFor注解)

    4、@EnableAutoConfiguration注解

    SpringBoot启动类=>@SpringBootApplication=>@EnableAutoConfiguration

    通过@EnableAutoConfiguration注解实现自动装配

    5、@AutoConfigurationPackage注解SpringBoot启动类=>@SpringBootApplication=>@EnableAutoConfiguration=>@AutoConfigurationPackage

    通过@AutoConfigurationPackage注解将添加该注解的类所在的package作为自动配置package进行管理

    通过AutoConfigurationPackages工具类获取自动配置package列表,也就是说当SpringBoot应用启动时默认会将启动类所在的package作为自动配置的package

    6、@EnableAutoConfiguration注解最重要的是AutoConfigurationImportSelector.class,将需要装配的类装配到IoC容器中,下面重点分析一下这个类的实现

    三、核心类分析

    1、selectImport方法

    AutoConfigurationImportSelector中的selectImport方法是自动装配的核心实现,它主要是读取META-INF/spring.factories文件,经过去重、过滤,返回需要装配的配置类集合

    2、getAutoConfigurationEntry方法

    selectImport方法=>getAutoConfigurationEntry方法

    getAttributes方法:获取@EnableAutoConfiguration中的exclude、excludeName等

    getCandidateConfigurations方法:获取所有自动装配的配置类,也就是读取spring.factories文件,后面会再次说明

    removeDuplicates方法:去除重复的配置项

    getExclusions方法:根据@EnableAutoConfiguration中的exclude、excludeName移除不需要的配置类

    fireAutoConfigurationImportEvents方法:广播事件

    最后根据多次过滤、判重返回配置类合集

    3、getCandidateConfigurations方法

    selectImport方法=>getAutoConfigurationEntry方法=>getCandidateConfigurations方法

    通过loadFactoryNames方法,扫描classpath下的META-INF/spring.factories文件,里面是以key=value形式存储,读取其中key=EnableAutoConfiguration,value就是需要装配的配置类,也就是getCandidateConfigurations返回的值

    四、总结

    1)通过注解@SpringBootApplication=>@EnableAutoConfiguration=>@Import({AutoConfigurationImportSelector.class})实现自动装配

    2)AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类

    3)通过Spring提供的SpringFactoriesLoader机制,扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类

    4)依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配

  • 相关阅读:
    从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能
    【python基础】函数-值传递
    DM数据守护集群搭建
    阐述 Git 命令 reset 和 revert
    数据库管理-第157期 Oracle Vector DB & AI-08(20240301)
    Java“实战”问题三连,你面试时遇到了吗?冲刺大厂面试
    源码分析Mybatis拦截器(Interceptor)拦截saveBatch()获取不到实体id的原因
    LeetCode150. 逆波兰表达式求值
    给虚拟机配置固定局域网IP
    EFK部署centos7.9(一)ES单节点部署
  • 原文地址:https://blog.csdn.net/wwh1st/article/details/133083297