Spring中Bean的实例化过程(二)

AbstractAutowireCapableBeanFactory # createBean(),整体方法如下:

/**
 * Central method of this class: creates a bean instance,
 * populates the bean instance, applies post-processors, etc.
 * @see #doCreateBean
 */
@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
		throws BeanCreationException {

	if (logger.isDebugEnabled()) {
		logger.debug("Creating instance of bean '" + beanName + "'");
	}
	RootBeanDefinition mbdToUse = mbd;

	// Make sure bean class is actually resolved at this point, and
	// clone the bean definition in case of a dynamically resolved Class
	// which cannot be stored in the shared merged bean definition.
	// 1.解析beanName对应的Bean的类型
	Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
	if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
		mbdToUse = new RootBeanDefinition(mbd);
		mbdToUse.setBeanClass(resolvedClass);
	}

	// Prepare method overrides.
	try {
		// 2.验证及准备覆盖的方法(对override属性进行标记及验证)
		mbdToUse.prepareMethodOverrides();
	}
	catch (BeanDefinitionValidationException ex) {
		throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
				beanName, "Validation of method overrides failed", ex);
	}

	try {
		// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
		// 3.实例化前的处理,给InstantiationAwareBeanPostProcessor一个机会返回代理对象来替代真正的bean实例,达到“短路”效果
		Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
		// 4.如果bean不为空,则会跳过Spring默认的实例化过程,直接使用返回的bean
		if (bean != null) {
			return bean;
		}
	}
	catch (Throwable ex) {
		throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
				"BeanPostProcessor before instantiation of bean failed", ex);
	}

	try {
		// ========================================================================================================!!
		Object beanInstance = doCreateBean(beanName, mbdToUse, args);
		if (logger.isDebugEnabled()) {
			logger.debug("Finished creating instance of bean '" + beanName + "'");
		}
		return beanInstance;
	}
	catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
		// A previously detected exception with proper bean creation context already,
		// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
		throw ex;
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
				mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
	}
}

在这里插入图片描述
执行到图上这行代码时,会执行所有的InstantiationAwareBeanPostProcessor类型的后置处理器,从这行代码跟进去
在这里插入图片描述
先执行Before方法,如果bean不为null再执行After方法,然后根据bean的状态设置mbd的beforeInstantiationResolved状态,下面看一下Before方法
在这里插入图片描述
拿出所有的后置处理器拿出InstantiationAwareBeanPostProcessor类型的,分别执行处理器中的方法
postProcessBeforeInstantiation(),返回执行结果
在这里插入图片描述
在执行完之后,返回的是null,下面测试一下自己的代码

@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
	@Override
	public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		if (beanName.equals("userService")){
			System.out.println("自定义处理器的:postProcessBeforeInstantiation执行了");
			return new MyBean();
		}
		return beanClass;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		if (beanName.equals("userService")){
			System.out.println("自定义处理器的:postProcessBeforeInstantiation执行了");
		}
		return bean;
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
控制台输出:
在这里插入图片描述
回到AbstractAutowireCapableBeanFactory # createBean()
在这里插入图片描述
AbstractAutowireCapableBeanFactory # doCreateBean

在这里插入图片描述
AbstractAutowireCapableBeanFactory # createBeanInstance
在这里插入图片描述
在这里插入图片描述
进入上图中最后一行代码中的方法:
AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
在这里插入图片描述
在这个方法中,循环所有的后置处理器,拿出SmartInstantiationAwareBeanPostProcessor类型的后置处理器,执行determineCandidateConstructors 方法,此时所有后置处理器中实现了该接口的有
在这里插入图片描述
其中只有AutowiredAnnotationBeanPostProcessor 的determineCandidateConstructors 方法有意义(该方法在后面的章节中单独解释),其他两个都直接返回null
在这里插入图片描述
上图中if判断条件均返回false,进入到instantiateBean(beanName, mbd)
AbstractAutowireCapableBeanFactory # instantiateBean
在这里插入图片描述
SimpleInstantiationStrategy # instantiate
在这里插入图片描述
BeanUtils # instantiateClass
在这里插入图片描述
回到 AbstractAutowireCapableBeanFactory # instantiateBean,此时UserService对象已经被创建出来了,用一个包装类,包装之后返回
在这里插入图片描述
回到AbstractAutowireCapableBeanFactory # doCreateBean
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值