springboot自动配置@springbootApplication
2020-10-16 10:02:22 3 举报
springboot自动配置-@springbootApplication
作者其他创作
大纲/内容
开始调用springboot的源码
org.springframework.context.annotation.DeferredImportSelector.Group#process
getAutoConfigurationMetadata()解析所有的spring.factories文件中的所有类路径
@SpringBootConfiguration
解析器解析
((AbstractApplicationContext) applicationContext).refresh();
没有直接实现ImportSelector,而是实现这个延迟选择器,没有直接调用selectImports方法,而是先进行一定的处理。
导入自动配置相关资源
refreshContext(context);
getCandidateConfigurations
如何将自动配置类加载并注册到容器中的
getSpringFactoriesLoaderFactoryClass()
获取这四种属性并赋值给监听器
listener.onAutoConfigurationImportEvent(event);
开启自动配置功能@EnableAutoConfiguration
实现监听器接口就可以拿到这些属性,比如拿到环境来获取环境的属性,拿到beanFactory来对容器中的beanDefinition进行修改,注册bean等等
类似于上面获取自动配置类的方式,还是使用SpringFactoriesLoader通过SPI的方式获取所有的AutoConfigurationImportListener
设置这四种属性。
注册的beanName就是自动配置包的路径
PostProcessorRegistrationDelegate.ispan style=\"font-size: inherit;\
org.springframework.context.annotation.ConfigurationClassParser#parse(Set)
invokeBeanFactoryPostProcessors(beanFactory);
特殊的部分
最终调用到spring源码org.springframework.context.support.AbstractApplicationContext#refresh
implement
最终调回spring的容器启动AbstractApplicationContext#refresh中的下一步进行类的注册
beanClassLoaderbeanFactoryenvironmentresourceLoader
refresh(context);
标明配置类
invokeAwareMethods(listener);
@Import(AutoConfigurationPackages.Registrar.class)
private static final String BEAN = AutoConfigurationPackages.class.getName();
获取配置的排除类,并在自动配置类集合中去除
用于扫描和指定不需要扫描的类
值最低的对象优先级最高
首先启动类启动的run方法
标记启动类所在的包为自动配置
扩展
上面是获取spring.factories文件中所有的类,这里是获取spring-boot-autoconfigure包的META-INF/spring.factories中所有的自动配置类(EnableAutoConfiguration),并去重
//springboot就是通过spring在这里留有的扩展方法进行对接的,也就是在这里加载的this.deferredImportSelectorHandler.process();
首先获取@SpringBootApplication注解的属性
ImportBeanDefinitionRegistrar
org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar#registerBeanDefinitions
registerBeanPostProcessors(beanFactory);
returnEnableAutoConfiguration.class
解析方法中分两部分
processConfigBeanDefinitions(registry);
通过SpringFactoriesLoader加载器获取spring.factories中EnableAutoConfiguration下的所有自动配置类
源码解析
List<AutoConfigurationImportListener> listeners = getAutoConfigurationImportListeners();
在最后解析springboot的注解时,解析到springbootApplication注解时,由ConfigurationClassParser.DeferredImportSelectorHandler#process进行解析
SpringBootApplication
postProcessor.postProcessBeanDefinitionRegistry(registry);
最后加载延迟选择器导入的类
刷新容器的方法
//设置加载顺序优先级接口Ordered
//第一次注册,首先创建一个beanDefinition,设置beanClass为BasePackages, GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(BasePackages.class);
利用这个方法来扩展,这里可以拿到自动配置类和需要排除的类,来进行进一步的操作。
handler.processGroupImports();
springboot的自动配置入口
annotationMetadata启动时就是@SpringBootApplication
@Import(AutoConfigurationImportSelector.class)
源码
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry
parser.parse(candidates);
@ComponentScan
首先解析spring自身的注解、beanDefinition和spring的其他类
这部分就表明了是先加载spring的,再加载springboot的
向容器中注册beanName(为springboot自动配置包的bean)
返回结果:this.autoConfigurationMetadata
将最终获取到的符合条件的自动配置类和需要排除的作为属性创建自动配置导入事件
DeferredImportSelector
获取所有的import的自动配置类
将spring的,springboot的自动配置类以及自动配置类 中的@bean修饰的方法备案/@Import引入的类注册到容器中
过滤掉不符合条件的自动配置类
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.AutoConfigurationGroup#process
这部分和spring容器初始化启动都是一样的
AnnotationAttributes attributes = getAttributes(annotationMetadata);
实现的核心接口
@Configuration
发布自动配置导入事件
@AutoConfigurationPackage
自动配置的扩展点
该类标记为full类型,将启动类变为CGLib类型,保证该类中的方法bean实例是单例对象。
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener#onAutoConfigurationImportEvent
0 条评论
下一页