从源码分析bean实例化过程

实例化过程流程图
在这里插入图片描述

实例化过程

查看源码如何实例化bean

1.找到doCreateBean方法,查看调用createBeanInstance方法
在这里插入图片描述在这里插入图片描述

2.调用instantiateBean方法,使用默认构造器实例化bean
在这里插入图片描述
3.调用instantiate接口方法,获取构造器
在这里插入图片描述
4.调用instantiateClass方法,返回 bean对象
在这里插入图片描述

初始化过程

查看源码如何初始化bean

1.填充属性,上面doCreateBean方法中,先去实例化bean,拿到的bean对象值全是空的,下面需要对bean对象赋值,也就是填充属性。同样在doCreateBean方法找调用填充属性方法populateBean

在这里插入图片描述
2.调用initializeBean方法,初始化bean
在这里插入图片描述
在这里插入图片描述
这个方法非常重要,里面有调用aware方法,前置处理,调用Init-method方法, 后置处理,分析下里面的代码

protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
	if (System.getSecurityManager() != null) {
		AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
			invokeAwareMethods(beanName, bean);
			return null;
		}, getAccessControlContext());
	}
	else {
		//调用Aware方法,为什么调用aware方法?
		invokeAwareMethods(beanName, bean);
	}

	Object wrappedBean = bean;
	if (mbd == null || !mbd.isSynthetic()) {
		//前置处理
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}

	try {
		//初始化
		invokeInitMethods(beanName, wrappedBean, mbd);
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
				(mbd != null ? mbd.getResourceDescription() : null),
				beanName, "Invocation of init method failed", ex);
	}
	if (mbd == null || !mbd.isSynthetic()) {
		//后置处理
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}

	return wrappedBean;
}

3.执行Aware方法,为什么要执行Aware方法?
在bean对象中分为两种,一种用户自己定义的bean,一种是容器的bean,Aware接口是为了让自定义对象方便获取容器对象。可以看到BeanFactory接口中注释说明,完整的bean生命周期中,有大量关于Aware接口,调用aware接口时全是set方法,这样后期可以方便使用
在这里插入图片描述
在这里插入图片描述
4.前置处理,调用applyBeanPostProcessorsBeforeInitialization方法,完成前置处理
在这里插入图片描述
5.调用init-method方法
在这里插入图片描述
6.后置处理,调用applyBeanPostProcessorsAfterInitialization方法
在这里插入图片描述
看下后置处理如何用动态代理的
找到applyBeanPostProcessorsAfterInitialization方法,点击postProcessAfterInitialization接口方法
在这里插入图片描述

在这里插入图片描述
点击postProcessAfterInitialization,找到AbstractAutoProxyCreator类,查看子类实现
在这里插入图片描述
在这里插入图片描述
点击wrapIfNecessary方法
在这里插入图片描述
点击createProxy方法
在这里插入图片描述
点击getProxy方法
在这里插入图片描述
继续往下面点击getProxy方法,找到AopProxy,aop代理接口,然后看getProxy的子类实现,可以看到有两种实现方式,一种是cglib代理,一种是JDK代理
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值