java技术底层核心
前言
所有上层建筑都基于核心正所谓十年树木百年根基,java也不例外 Spring基础框架 以至于现在巅峰技术微服务基于几个实现对spring进行封完成自动配置
@SpringBootApplication(元注解 @ComponentScan、@SpringBootConfiguration、@EnableAutoConfiguration分层以下深入
@Import注解
@Enable底层依赖于@Import注解,使用@Import导入的类被Spring加载到IOC中。
@EnableAutoConfiguration
@EnableAutoConfiguration注解实际依赖与@Import(ImportSelector.class)进行Bean的初始化。
————————————————
第一节 @Import的4种用法
1. 导入Bean
@Import(User.class)
Import直接导入Bean,直接通过简写的名称是无法获取的,导入的Bean可以通过类全名获取。也可以如图,通过getBean(Class aClass)来获取。
2. 导入配置类XxxConfig
@Import(UserConfig.class)
使用Import注解时,@Configuration注解是不需要的。而UserConfig下的所有Bean都会被加载。
通过例子,同样可以获取到Bean
3. 导入 ImportSelector实现类。(一般用于加载配置文件种的类)
在pojo里自定义ImportSelector
然后在enable工程里启动类里导入这个ImportSelector
运行之后,同样可以获取到User
注:这种配置方式会通过配置文件的形式存在,不会直接写到方法里面。
4. 导入ImportBeanDefinitionRegistrar实现类
在pojo工程里自定义ImportBeanDefinitionRegistrar
然后在enable工程启动类导入这个类,并运行,同样可以获取到User。
1 @Import(MyImportBeanDefinitionRegistrar.class)
第二节、EnableAutoConfiguration注解原理解析
通过跟踪@SpringBootApplication的源码,去了解它的加载流程。
细节重点,进入到getAutoConfigurationEntry
接着继续进去看重点的加载方法getAutoConfigurationEntry
进到META-INF/spring.factories里面去看(位置:spring-boot-autoconfigure.jar下)
通过上面的图文流程,可以知道它的加载原理。
当然这些类不可能都被加载,这里点进一个类查看源码。
进到源码发现,实际上它是有@Conditional条件限制的,只有满足条件才会被加载,否则不会被初始化加载到容器中。
结论:
- Springboot在加载配置类的时候,内部实际上就是通过@ImportSelector来完成的(@Import(AutoConfigurationImportSelector.class))。
- 通过源码跟踪,我们发现实际上它的配置都来自于META-INF/spring.fatcories,该文件定义了大量的配置类。Springboot启动时会加载这些类,初始化Bean。
- 而且加载这些配置初始化Bean的时候,只有满足Condition条件才会加载到容器种
————————————————