SpringBoot自动装配流程
SpringBoot自动装配原理
- Spring和SpringBoot的关系和区别
- SpringBoot的核心注解
- @SpringBootApplication注解:
- SpringBoot自动配置原理
- 自己理解的:
- 网上统一概述的:
Spring和SpringBoot的关系和区别
SpringBoot是Spring生态中的产品
Spring是一个容器框架
SpringBoot不是一个框架、他是一个可以快速架构,基于Spring的脚手架(里面包含了Spring和各种框架,为开发Spring生态其他框架铺平道路)
SpringBoot的核心注解
@SpringBootApplication注解:
这个注解标识了一个SpringBoot工程,它实际上是另外三个注解的组合,这三个注解分别是:
- @SpringBootConfiguration:这个注解实际就是一个@Configuration,标记当前类是个配置类;
- @EnableAutoConfiguration:向Spring容器中导入了一个Selector,用来加载类路径下 Spring容器中所定义的自动配置类,将这些类加载为配置Bean;
- @Conditional也很关键,如果没有它我们无法在自定义应用中进行定制开发:
- @ConditionalOnBean
- @ConditionalOnClass
- @ConditionalOnExpression
- @ConditionalOnMissingBean
- 。。。 。。。 。。。
其它例如 @Configuration、@Bean、@Import 。这些在SpringBoot中较为常见的注解 其实是Spring提供的,并不属于SpringBoot注解
SpringBoot自动配置原理
自己理解的:
- 通过类中的@SpringBootApplication注解(该注解是个组合注解 同时标注该类是启动类)
- @SpringBootApplication组合注解中的@EnableAutoConfiguration注解,通过@Import引入了AutoConfigurationImportSelector服务,该服务实现了DeferredImportSelector(延迟导入),去导入一些Bean组件(通过重写ImportSelector服务中的selectImports方法是实现 具体步骤如下
(1)(具体实现是:selectImports方法中调用了getAutoConfigurationEntry方法,在该方法中,会通过getCandidateConfigurations方法通过SpringFactoriesLoader中的loadFactoryNames方法调用loadSpringFactories 获取所有的候选配置类(所有 META-INF/spring.factories路径下的所有文件找出来,然后根据EnableAutoConfiguration的完整类路径初筛一遍(loadFactoryNames方法入参时一步一步带入进来的筛选路径))))
(2)selectImports方法中调用了getAutoConfigurationEntry方法,在该方法中通过getCandidateConfigurations方法获取完初次筛选后的配置类后再通过getConfigurationClassFilter().filter()筛选有效启动的自动配置类(根据@ConditionalOnBean、@ConditionalOnClass等注解排除无效的自动配置类)
网上统一概述的:
- 通过@SpringBootApplication引入@EnableAutoConfiguration(负责启动自动配置功能)
- 通过@EnableAutoConfiguration引入@Import
- Spring容器启动是,加载IOC容器会解析@import注解
- @Import导入了一个DeferredImportSelector(在解析配置类时只是将其加入到一个容器中,等到所有的配置类都解析完成后才会处理DeferredImportSelector。它会使SpringBoot的自动配置类顺序排在最后,这样方便我们扩展和覆盖)
- 然后读取所有的/META-INF/spring.factorles文件(SPI)
- 过滤出所有AutoConfigurtionClass类型的类
- 最后通过@ConditionalOn*** 排除无效的自动配置类