spring启动流程
2021-09-28 11:37:18 2 举报
AI智能生成
超详细的spring启动流程
作者其他创作
大纲/内容
初始化beanFactory属性在父类GenericApplicationContext中this.beanFactory = new DefaultListableBeanFactory()
默认属性beanName生成器 BeanNameGenerator beanNameGenerator = AnnotationBeanNameGenerator.INSTANCEscope注解元素解析器 ScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver()
创建环境getOrCreateEnvironment(registry)
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry),向beanFactory中注册5个BeanPostProcessor的bean定义
初始化read属性this.reader = AnnotatedBeanDefinitionReader(this)
registerDefaultFilters()
setEnvironment()设置环境
setResourceLoader()设置资源加载器
初始化scanner属性(bean扫描器)this.scanner = new ClassPathBeanDefinitionScanner(this)
AnnotationConfigApplicationContext()
this()
将componentClasses解析成AnnotatedGenericBeanDefinition,是BeanDefinition的一个子类
使用1.1.2.1中的this.scopeMetadataResolver 判断是否有Scope注解,获取属性,设置bean的作用域
使用1.1.2.1中的this.beanNameGenerator 推断bean的名称,设置beanName,假设这里得到的beanName是demoConfig
解析Lazy注解,设置beanDefinition的lazyInit属性
解析Primary注解,设置beanDefinition的primary属性
解析DependsOn注解,设置beanDefinition的dependsOn属性
解析Role注解,设置beanDefinition的role属性
解析Description注解,设置beanDefinition的description属性
继续丰富demoConfig的beanDefinition
创建demoConfig的beanDefinition的持有器
属性beanDefinitionMap是ConcurrentHashMap,存放beanDefinition
属性beanDefinitionNames是ArrayList,存放beanName
this.beanDefinitionNames.add(beanName)
removeManualSingletonName(beanName)
在DefaultListableBeanFactory中调用
将beanConfig的beanDefinition注册进IOC容器
doRegisterBean方法
this.reader.register(componentClasses)使用1.1.2中创建的reader(AnnotatedBeanDefinitionReader)
register(componentClasses)
设置容器的启动时间、启动状态
initPropertySources() 初始化加载配置文件方法 空方法
getEnvironment().validateRequiredProperties() 检查环境变量
设置属性 earlyApplicationListeners 数据结构是LinkedHashSet
设置属性 earlyApplicationEvents 数据结构是LinkedHashSet
prepareRefresh()
设置beanFactory的serializationId属性
refreshBeanFactory()
返回之前获得的beanFactory对象
getBeanFactory()
obtainFreshBeanFactory()
设置beanFactory的属性 beanClassLoader 类加载器
设置beanFactory的属性 beanExpressionResolver bean表达式解析器
设置beanFactory的属性 propertyEditorRegistrars 属性编辑器支持
BeanPostProcessor接口
向beanFactory中添加一个beanPostProcessor ApplicationContextAwareProcessor这是beanFactory的第一个bean后置处理器
EnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware到这里总共会有9个
设置属性ignoredDependencyInterfaces 添加6个忽略接口类如果某个bean依赖这几个接口的实现类,在自动装配的时候忽略它们,spring会通过其他方式来处理这些依赖
BeanFactoryResourceLoaderApplicationEventPublisherApplicationContext
设置属性resolvableDependencies,添加4个特殊类如果有bean依赖这几个bean,直接从这里获取注入
添加一个BeanPostProcessor ApplicationListenerDetector
如果存在bean名称为loadTimeWeaver的bean则注册一个BeanPostProcessor
注册名为loadTimeWeaver的bean默认不执行
1. environment,getEnvironment()2. systemProperties, getEnvironment().getSystemProperties()3. systemEnvironment,getEnvironment().getSystemEnvironment()
注册3个和环境相关的bean
prepareBeanFactory(beanFactory)
spring提供的扩展点,待子类实现
postProcessBeanFactory(beanFactory)
执行参数传入的BeanDefinitionRegistryPostProcessor
将得到的后置处理器放入局部变量currentRegistryProcessorsprocessedBeans
currentRegistryProcessors排序
registryProcessors.addAll(currentRegistryProcessors)
拿到所有的beanDefinitionNmae String[]candidateNames=registry.getBeanDefinitionNames()
循环所有的beanDefinition找到配置类(Configuration)这里会打标识,标识配置类的类型为Full还是Lite
看用户有没有自定义bean命名方式
配置类解析器ConfigurationClassParserparser,这个类非常重要,下面就是用它来解析对@Component、@Import等注解的
这里只有一个DemoConfig元素
candidates:需要解析的配置类
alreadyParsed:完成解析的配置类
定义两个变量
处理@Component注解
处理@PropertySource注解
定义扫描器ClassPathBeanDefinitionScanner
是否重写了命名规则
解析ComponentScan注解的各个属性
添加排除规则
根据传入的basePackage得到扫描路径
根据扫描路径得到该路径下的所有class文件对应的Resource
根据class文件的Resouce通过asm解析得到MetadataReader
从MetadataReader中找到需要spring托管的MetadataReader,将其转化为ScannedGenericBeanDefinition,ScannedGenericBeanDefinition为BeanDefinition的子类
将Resource转化为beanDefinition
根据包路径,得到符合条件的BeanDefinition
scope属性
指定beanName
Lazy属性
Primary属性
DependsOn属性
Role属性
Description属性
遍历BeanDefinition,进一步丰富beanDefinition信息
将BeanDefinition添加到beanFactory
scanner.doScan(StringUtils.toStringArray(basePackages))
开始扫描
处理@ComponentScan/@ComponentScans注解
注册beanDefinition org.springframework.aop.config.internalAutoProxyCreator
注册beanPostProcessor AnnotationAwareAspectJAutoProxyCreator
判断是否强制使用cglib动态代理 proxyTargetClass为true
如果加了@EnableAspectJAutoProxy这里会注册AspectJAutoProxyRegistrar这就是开启了aop
处理@Import注解
处理@ImportResource注解
处理@Bean的注解
返回配置类的父类,会在processConfigurationClass(...)方法的下一次循环时解析
进入ConfigurationClassPaser.processorConfigurationClass()
解析配置类,parser.parse(candidates)
创建reader,这个reader与前面ApplicationContext中的reader不是同一个
调用ConfigurationClassPostProcessor.processConfigBeanDefinitions(BeanDefinitionRegistry registry)
currentRegistryProcessors.clear()
遍历结果,寻找实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor会得到ConfigurationClassPostProcessor
通过beanFactory.getBeanNamesForType()方法找到实现了BeanDefinitionRegistryPostProcessor接口的beanPostProcessor
执行spring内部提供的
执行剩下的BeanDefinitionRegistryPostProcessor也就是在上一步中加载到的BeanDefinitionRegistryPostProcessor
先执行BeanDefinitionRegistryPostProcessor局部变量:processedBeans:存放所有BeanDefinitionRegistryPostProcessor的名字regularPostProcessors:存放BeanFactoryPostProcessorregistryProcessors:存放BeanDefinitionRegistryPostProcessorcurrentRegistryProcessors:临时变量,装载BeanDefinitionRegistryPostProcessor
执行开发者调用applicationContext.addBeanFactoryPostProcessor添加的BeanDefinitionRegistryPostProcessor
执行实现了PriorityOrdered接口的BeanFactoryPostProcessor
执行实现了Ordered接口的BeanFactoryPostProcessor
执行剩下的BeanFactoryPostProcessor
执行BeanFactoryPostProcessor
BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类,同样要执行BeanFactoryPostProcessor的方法
总体流程:先执行BeanDefinitionRegistryPostProcessor,再执行BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory)
将实现了PiorityOrdered的BeanPostProcessor注册到beanFactory
将实现了Ordered的BeanPostProcessor注册到BeanFactory
将不满足上面两个条件的BeanPostProcessor注册到BeanFactory
将所有实现了MergedBeanDefinitionPostProcessor接口的BeanPostProcessor注册到BeanFactory
registerBeanPostProcessors(beanFactory)对BeanPostProcessor进行注册操作即加到BeanFactory的beanPostProcessors属性中,是一个CopyOnWriteArrayList
如果MessageSource存在就设置一些属性,如果不存在就创建再设置属性。最后注册 到BeanFactory
initMessageSource国际化与事件处理
如果存在事件广播器就用存在的,如果不存在就创建,再注册到BeanFactory
initApplicationEventMulticaster初始化广播器ApplicationEventMulticaster
spring的一个扩展点
onRefresh
向广播器中添加AbstractApplicationContext.applicationContextListeners中的监听器
从beanFactory中获取ApplicationListener类型的bean,即为监听器,注册到广播器中
getApplicationEventMulticaster().multicastEvent(earlyEvent)
如果有早期事件earlyApplicationEvents
registerListeners()注册事件监听器
获取beanFactory中的beanNames并遍历
通过beanName获取BeanDefinition,进行条件判断不是抽象类、是单例的且不是懒加载的
确保class被加载
覆写方法
当有aop 的时候会执行到AnnotationAwareAspectJAutoProxyCreator其父类AbstractAutoProxyCreator的postProcessBeforeInstantiation这里会开始扫描切面,包装切面方法即切面方法
遍历所有的beanPostProcessor执行postProcessBeforeInstantiation方法
使用实例化方法:obtainFromSupplier
使用工厂方法:instantiateUsingFactoryMethod
使用有参构造:autowireConstructor
使用无参构造:instantiateBean
实例化创建实例
终调用的是java.lang.reflect.Constructor#newInstance,这就是jdk的反射了
CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition查找带有@Resource注解的属性和方法
循环查询父类,从当前类开始,找完当前类就找当前类的父类,直接Object为止
查找属性与方法,属性找到后封装为AutowiredFieldElement,方法找到后封装为AutowiredMethodElement
调用AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition查找带有@Autowired、@Value注解的属性和方法
调用后置处理器
查找属性applyMergedBeanDefinitionPostProcessors
三级缓存池singletonFactories
getEarlyBeanReference()提前生成代理对象
满足三个条件的话单例bean支持循环依赖bean正在创建
AutowiredAnnotationBeanPostProcessor.postProcessProperties处理@Autowired、@Value注解,CommonAnnotationBeanPostProcessor.postProcessProperties处理@Resource注解
处理@Autowired时,先根据类型找到所有的Class,如果有多个,再根据注入属性的名称查找符合的Class,最后调用beanFactory.getBean(...)从spring获取要注入的对象,通过反射机制为对应的属性设置值
注入属性
执行Awarebean的相关方法
1.运行invokeAwareMethods
运行后置处理器的postProcessBeforeInitialization方法
2.运行applyBeanPostProcessorsBeforeInitialization//执行spring当中的内置处理器——xxxPostProcessor-------@PostConstruct
如果bean实现了InitializingBean接口,则调用afterPropertiesSet()
执行自定义的初始化方法,即在xml中,通过init-method指定的方法
调用bean的初始化方法
3.执行InitializingBean初始化
处理ApplicationListener的,如果有bean实现了ApplicationListener,就是在这里添加到spring的监听器列表的
4.运行applyBeanPostProcessorsAfterInitialization
创建springbean
遍历调用getBean(beanName)创建bean并将其添加到spring中
preInstantiateSingletons()
finishBeanFactoryInitialization(beanFactory)完成bean的初始化
finishRefresh()完成启动
refresh()
spring启动流程
收藏
0 条评论
回复 删除
下一页