Springboot自动装配
SpringBoot自动装配
概述
使用 Spring 进行开发各种配置过于麻烦比如开启某些 Spring 特性时,需要用 XML 或 Java 进行显式配置。于是,Spring Boot 诞生了!Spring 旨在简化 J2EE 企业应用程序开发。Spring Boot 旨在简化 Spring 开发(减少配置文件,开箱即用!)
Spring Boot只是简化了配置,如果你需要构建MVC架构的Web程序,你还是需要使用Spring MVC作为MVC框架,只是说SpringBoot帮你简化了Spring MVC的很多配置,真正做到开箱即用!
自动装配原理
SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories
文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能。
核心注解:
@EnableAutoConfiguration
:启用 SpringBoot 的自动配置机制(实现自动装配的重要注解,主要是Import了AutoConfigurationImportSelector
这个自动装配类)@Configuration
:允许在上下文中注册额外的 bean 或导入其他配置类@ComponentScan
:扫描被@Component
(@Service
,@Controller
)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。如下图所示,容器中将排除TypeExcludeFilter
和AutoConfigurationExcludeFilter
。
AutoConfigurationImportSelector
AutoConfigurationImportSelector
类实现了 ImportSelector
接口,也就实现了这个接口中的 selectImports
方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中。
该方法调用链如下:
- 判断自动装配开关是否打开
- 用于获取
EnableAutoConfiguration
注解中的exclude
和excludeName
(用于手动导入的配置类)。 - 读取
META-INF/spring.factories
获取需要自动装配的所有配置类 - 对配置类进行筛选,
@ConditionalOnXXX
中的所有条件都满足,该类才会生效。 - 执行配置类,加载相应bean对象
启动流程
run方法进入,传入启动类class的原因(标记启动类,方便后续解析启动类注解)
创建SpringApplication
- 保存启动类class
- 判断WebApplication类型
- 读取
spring.factories
文件设置初始化器 - 读取
spring.factories
文件设置监听器
这里会将
spring.factories
文件的配置设置到map缓存中。并且调用SpringApplication的run方法
- 创建上下文对象,开启监听器
- 封装Environment环境对象
- 准备上下文对象,创建Spring容器将系统启动类放进去
- 进入refresh方法,会根据配置类包括启动类,解析相应注解,其中
@Import
引入了AutoConfigurationImportSelector
进行上述的自动装配流程
实现一个Starter
创建
XXX-spring-boot-starter
工程引入 Spring Boot 相关依赖
创建
XXXAutoConfiguration
配置类在
XXX-spring-boot-starter
工程的 resources 包下创建META-INF/spring.factories
文件1
2org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.example.XXXAutoConfiguration在其他工程中引用使用