spring启动流程
2022-03-29 21:30:31 0 举报
超详细的spring启动流程
作者其他创作
大纲/内容
AutowiredFieldElement
从mergedBeanDefinitions获取beandefinition
返回false
判断是否是factoryBean
instanceWrapper不为空则开始创建bean
doWithLocalFields遍历targetClass中的所有Field
@Bean
在bean前拼接上&符号
判断candidate是否是一个beandefinition
判断是不是合并后的beandefinition
if (method.getParameterCount() == 0)方法没有参数则抛异常
其他
为空
registerBeanDefinition把BeanDefinitionHolder注册到beanfactory内
去父beanfactory中查找bean
lamad表达式调用findAutowiredAnnotationmethod上是否存在@Autowired、@Value、@Inject中的其中一个
registerBeanPostProcessors将扫描到的BeanPostProcessors实例化并排序,并添加到BeanFactory的beanPostProcessors属性中去
通过
prepareBeanFactory初始化beanFactory
把合并后的beandefinition set到mergedBeanDefinitions中
获取当前类的父类赋值给targetClass如果有则开始下一次循环
父bean是否是当前bean
doWithLocalMethods遍历targetClass中的所有Method
调用MergedBeanDefinitionPostProcessor
不存在
initApplicationEventMulticaster设置ApplicationContext的applicationEventMulticaster,么是用户设置的,要么是SimpleApplicationEventMulticaster
判断父bean在当前beanfactory中不存在并且有父beanfactory
被过滤
AutowiredAnnotationBeanPostProcessor.postProcessPropertiesfindAutowiringMetadata获取所有注入点带@autowired的方法和属性
判断实例化前是否返回对象
instanceWrapper创建出来的对象不是空
被加载
populateBean属性填充
判断是否存在spring.components配置文件
getBeanAbstractBeanFactory.doGetBean
beforeInstantiationResolved设置是否初始化完成
不需要
createBeanInstance
属性
args为空
返回对象是否会带有aop
实例化完成
invokeBeanFactoryPostProcessors内调用扫描器的scan方法,扫描所有文件
getMergedLocalBeanDefinition合并beanDefinition
实例化前
从beanDefinitionMap获取beandefinition
子BeanDefinition的属性覆盖父BeanDefinition的属性,这就是合并
抛异常
实例化之后,属性设置之前调用初始化后方法postProcessAfterInstantiation
获取父beanFactory
在这一步会调用AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition方法进行扫描所有的注入点
finishBeanFactoryInitialization//初始化Bean
生成一个beanwrapper对象返回
获取合并后的beanDefinition
判断有没有parentBean
获取所有的beanName循环遍历
finishRefresh
依赖注入在这一步findInjectionMetadata
根据filed从BeanFactory中查到的匹配的Bean对象resolveFieldValue()
则克隆一个beandefinition
instanceWrapper有可能在本bean创建之前,就有其他bean把当前bean给创建出来了(例如依赖注入)
autowireConstructor
单例
autowireNecessary为false则表示无参构造方法
判断beandefinition类型
Modifier.isStatic(field.getModifiers())获取到了注入点判断是不是static,是的话则不注入
一个原型BeanDefinition,会多次来创建Bean,那么就可以把该BeanDefinition所要使用的构造方法缓存起来,避免每次都进行构造方法推断
不清楚作用
循环遍历获取出来的所有的beandefinition
判断pvs是否为空
不为空
创建RootBeanDefinition
直接返回
判断BeanWrapper是否为空
判断是否为空
判断@bean有没有写autowired配置
循环执行InstantiationAwareBeanPostProcessor实现类的postProcessProperties方法@Autowired实现类AutowiredAnnotationBeanPostProcessor
obtainFreshBeanFactory销毁beanFactory创建一个新的beanFactory
判断scope属性
扫描beandefinition步骤
existingDefinition不为空或singletonObjects存在该beanName
执行完findAutowiringMetadata方法
为beandefinition赋一些默认值
singletonObjects单例池内获取
没有
需要
findPropertyForMethod
解析类上的注解@Lazy、@Primary、@DependsOn、@Role、@Description
不是
返回true
返回
doCreateBean创建对象
放到currElements中缓存
执行实例化后方法postProcessAfterInitialization如果实例化后的方法有返回则继续执行,否则直接返回
AnnotationConfigApplicationContext无参的构造方法,构造扫描器和读取器
创建一个ScannedGenericBeanDefinition为其赋值
checkCandidate判断spring容器内是否已存在该beanName
initMessageSource设置ApplicationContext的MessageSource,要么是用户设置的,要么是DelegatingMessageSource
bean没有设置scope属性则默认设置为singleton
判断构造方法是否需要注入
构造一个BeanDefinitionHolder
执行完后
调用lamad表达式createBean
instanceSuppliermbd.getInstanceSupplier()
resolveScopeMetadata获取出所有的类信息
instantiateUsingFactoryMethod
存在
findAutowiringMetadata方法
是
hasBeanCreationStarted判断alreadyCreated是否为空
hasInstantiationAwareBeanPostProcessors获取有没有InstantiationAwareBeanPostProcessor实现类
instanceSupplier不为空
直接使用无参构造方法
开始do{}while(targetClass != null && targetClass != Object.class)循环遍历
getPropertyValues
判断父BeanFactory不为空 并且当前BeanFactory内的BeanDefinition没有这个bean
判断该类是否是独立的类并且不为(抽象或接口类)或(是抽象类,但有写有Lookup注解的方法)
把实例化后的class设置进beanClass内
mbd.getFactoryMethodName()@Bean对应的beanfedinition,不是@bean则执行后续步骤初始化bean
不通过则抛异常
获取scope属性,是singleton还是原型还是等等
registerListeners把定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件
递归调用
resolveBeanClass实例化class
反射个对象赋值
findCandidateComponents开始扫描
原型
是否为空
onRefresh给子类的模板方法
判断是否是单例的
把注解的值赋值到beandefinition里
DefaultListableBeanFactory.preInstantiateSingletons实例化非懒加载的单例Bean
beforeSingletonCreation标记一下bean在创建中
判断bean是否是抽象的为抽象的则直接抛异常
AbstractBeanFactroy.getMergedBeanDefinition合并beandefiniton
执行完getBean
getMergedLocalBeanDefinition合并beandefinition
以上均不满足
执行实例化前方法postProcessBeforeInstantiation不管有多少个实例化前方法,只要某个方法返回了不为空则直接把返回对象return
AutowiredMethodElement
alreadyCreated存放的是PostProcessor
getSingleton单例池内获取bean
把beanType负值给beandefinition的resolvedTargetType
isCandidateComponent判断是否被excludeFilters所排除或includeFilters所加载
有
requiredType不为空
依赖描述器DependencyDescriptor
判断有没有带dependsOn注解的方法,有则需要先初始化DependsOn注解设置的bean
determineRequiredStatus构造注入点
判断ctors
方法
把这个beandefinition赋值到beanDefinitionMap内,再赋值到beanDefinitionNames内
buildAutowiringMetadata方法寻找注入点
循环依赖问题
typeCheckOnly不等于true
没有找到构造方法
合并后的beandefinition不是抽象的并且是单例的并且不是懒加载
不通过
isAlias判断beanName是否存在aliasMap内
getResources获取出所有的class文件进行遍历
lamad表达式调用findAutowiredAnnotationfield上是否存在@Autowired、@Value、@Inject中的其中一个
收藏
0 条评论
回复 删除
下一页