Spring 自动装配原理深度解析
Spring 自动装配原理
一、基础介绍
SpringBoot 的自动装配原理是基于 Spring Framework 的条件化配置和@EnableAutoConfiguration 注解实现的。这种机制允许开发者在项目中引入相关的依赖,SpringBoot 将根据这些依赖自动配置应用程序的上下文和功能。
SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的 META-INF/Spring.factories 文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。
通俗来讲,自动装配就是通过注解或一些简单的配置就可以在 SpringBoot 的帮助下开启和配置各种功能,比如数据库访问、Web 开发。
二、实现原理
@EnableAutoConfiguration 核心注解
@EnableAutoConfiguration 这个注解是实现自动装配的核心注解,它包含两个重要的组成部分:
1. @AutoConfigurationPackage
将项目 src 中 main 包下的所有组件注册到容器中,例如标注了 Component 注解的类等。
2. @Import({AutoConfigurationImportSelector.class})
是自动装配的核心,接下来分析一下这个注解。
AutoConfigurationImportSelector 工作机制
@Import({AutoConfigurationImportSelector.class}) 告诉 Spring 容器启动时,让 AutoConfigurationImportSelector 来决定哪些自动配置类需要导入。
AutoConfigurationImportSelector 是 Spring Boot 中一个重要的类,它实现了 ImportSelector 接口,用于实现自动配置的选择和导入。具体来说,它通过分析项目的类路径和条件来决定应该导入哪些自动配置类。
梳理一下,以下是 AutoConfigurationImportSelector 的主要工作:
1. 扫描类路径
在应用程序启动时,AutoConfigurationImportSelector 会扫描类路径上的 META-INF/Spring.factories 文件,这个文件中包含了各种 Spring 配置和扩展的定义。在这里,它会查找所有实现了 AutoConfiguration 接口的类,具体的实现为 getCandidateConfigurations 方法。
2. 条件判断
对于每一个发现的自动配置类,AutoConfigurationImportSelector 会使用条件判断机制(通常是通过 @ConditionalOnXxx 注解)来确定是否满足导入条件。这些条件可以是配置属性、类是否存在、Bean 是否存在等等。
3. 根据条件导入自动配置类
满足条件的自动配置类将被导入到应用程序的上下文中。这意味着它们会被实例化并应用于应用程序的配置。