bean的生命周期1
2019-10-29 10:02:38 0 举报
Spring Bean的生命周期
作者其他创作
大纲/内容
此方法包含了很多其他调用,例如注册监听器等等invokeBeanFactoryPostProcessorsregisterBeanPostProcessors 注册bean的后置处理器,主要用来做代理
instantiateBean
从缓存里取
3 .2 自定义方法 init()
入口AbstractApplicationContext
生命周期开启getBean
返回bean
doCreateBean完毕,此时bean已经实例化,接着继续初始化
注意哦,正常的bean已经正常实例化了,但是对于工厂bean ,还要做进一步处理,从工厂bean中再真正实例化getObject()对象
getBean
applyMergedBeanDefinitionPostProcessors
Bean的其中一个扩展点applyMergedBeanDefinitionPostProcessors()调用MergedBeanDefinitionPostProcessor() postProcessMergedBeanDefinition()
初始化前准备并缓存bean(addSingletonFactory)解决缓存依赖的关键步骤
初始化工作及循环依赖就在这个方法里面了
refresh()
resolveBeforeInstantiation
Bean的其中一个扩展点(待补充)singletonFactory,getObject实现了一下接口SmartInstantiationAwareBeanPostProcessor()在getSingleton()会被调用
1 判断该bean是否可以提前暴露,可以则把该bean放到缓存 boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); //1 是否单例 2 是否运行循环依赖(默认可以)3是否创建中
Bean的其中一个扩展点(AOP代理对象) 在resolveBeforeInstantiation()调用InstantiationAwareBeanPostProcessor() postProcessBeforeInstantiation() postProcessAfterInstantiation()
注册销毁接口BeanPostProcessors(注册销毁接口BeanPostProcessors)
符合规则并且是单例,开始创建
调用
3 invokeInitMethods
整个流程关键先要理解一下知识点1 关键类 context类(容器类) beanfactory(bean工厂类) bean(通过工厂生产)2 context类 就是入口,例如通过xml的ClassPathXmlApplicationContext的容器,通过注解,配置类的也会有自己的实现的容器类,主要工作就是进行解析,解析成工厂类统一的数据结构 beanfacotry 工厂类,通过contex类可以获取bean定义等等一系列内容,通过这些信息构造bean3 本流程是以xml的方式来解释整个bean的生命流程,注解和构造类的context大同小异AbstractApplicationContext ClassPathXmlApplicationContextAbstractAutowireCapableBeanFactory DefaultListableBeanFactory
调用无参构造函数,所以这个要解决循环依赖就是必须是通过无参构造
1检查别名transformedBeanName2 尝试从缓存里取实例,如果之前已经创建(getSingleton) markBeanAsCreated(beanName);
doGetBean
1初始化beanfactory(DefaultListableBeanFactory)2其他一些(待以后补充)3finishBeanFactoryInitialization(beanFactory);4beanFactory.preInstantiateSingletons();
根据RootBeanDefinition开始实例对象,注意如果bean是通过构造函数啊,自动注入就直接返回了bean了,但是如果涉及到循环依赖的话就直接在这里报错了,不会继续走下面的流程了,因为解决循环依赖的关键是那3个缓存map,通过从缓存了取出依赖的实例,但是现在的缓存都是空的,流程压根还没有到缓存那个步骤
上面resolveBeforeInstantiation()如果返回不为空 ,就不会往下执行了doCreateBean
执行一些准备工作准备调用createBean
1 修改状态=开始创建 markBeanAsCreated(beanName);2 final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);3 通过bean定义判断这个bean是否能创建,例如是否单例,是否抽象类等等
修改bean状态 从创建中的map中移除!this.singletonsCurrentlyInCreation.remove(beanName)
2 下图为准备工作的最后一步,也是AOP准备工作的第一步,把bean的切面切点等信息缓存起来,为创建代理对象作准备,注意缓存的的不是对象实例,因为到这里对象还是没有创建,只是把bean的aop相关定义另外缓存
早期对象:已经实例化,但还没初始化的(setter注入)
getSingleton()
1 再次通过RootBeanDefinition确定是否创建,并调用一些接口等等
2 BeanPostProcessor beanProcessor(扩展点)postProcessBeforeInitialization 前置处理器
3 .1 接口 InitializingBean()
2解决循环依赖的关键就是这里,在依赖注入之前先把自己放到一个缓存里,确保那些循环依赖的时候可以通过缓存里找到实例,所以那些通过构造函数,bean注入的那些bean走不到这步,因为之前就已经报错了
执行一些判断代码并从工厂里取出bean定义
0 条评论
下一页