bean的生命周期

AbstractBeanFactory.getBean()

//判断单例缓存中是否已存在
getSingleton(beanName)


AbstractAutowireCapableBeanFactory.createBean(Class<T> beanClass);


//实例化前 实例化后的 后置处理器  
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
resolveBeforeInstantiation(beanName, mbdToUse) != null  return;


//实例化 反射实现
createBeanInstance(beanName, mbd, args)


//Spring 是不知道会不会有循环依赖发生的,但是它不管,反正往 singletonFactories 塞这个工厂,
这个工厂的作用就是判断这个对象是否需要代理,如果是则返回代理对象,否则直接返回

//这里就是提前暴露,后面若有循环依赖则会被使用到,把我们实例化后的对象包装成一个singletonFactory对象, 
该对象提供了一个getObject方法,该方法内部调用getEarlyBeanReference方法。

if (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName)){

addSingletonFactory(beanName, new ObjectFactory<Object>() {
				@Override
				public Object getObject() throws BeansException {
					return getEarlyBeanReference(beanName, mbd, bean);
				}
			})

}

// Initialize the bean instance.
Object exposedObject = bean;
try {
    //属性注入
	populateBean(beanName, mbd, instanceWrapper);
	if (exposedObject != null) {
        //初始化  
		exposedObject = initializeBean(beanName, exposedObject, mbd);
            
              // invokeAwareMethods(beanName, bean)  初始化aware方法
              //  postProcessBeforeInitialization  初始化方法 前置处理
              // invokeInitMethods(beanName, wrappedBean, mbd) 初始化方法
              //  postProcessAfterInitialization   初始化方法 后置处理
	}
}

//注册销毁
registerDisposableBeanIfNecessary

Spring中bean的生命周期可分这四步:

1、实例化:

A instance = new A(),

a、申请分配内存空间,

b、将instance指向刚分配的内存空间,这个时候instance已经不为空了,若A中有成员变量则为默认值

c、调用A构造方法

单例模式中的双重检查问题,判断的instance需加volatile关键字

2、属性注入,属性赋值

3、初始化:调用aware方法,执行前置处理器, afterPropertiesSet、init方法,后置处理器(aop代理AnnotationAwareAspectJAutoProxyCreator实现了后置处理器)

4、销毁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值