Spring5 源码阅读笔记(1.4.2.4)populateBean(beanName, mbd, instanceWrapper) 填充Bean

回顾
1.4.2 createBean(beanName, mbd, args)
我们讲获取 Bean 实例的过程

1.4.2.1 createBeanInstance(beanName, mbd, args)
通过构造函数创建 Bean 实例。
构造函数上如果有 @Autowired,会先将引用类型的入参对象优先实例化。
但此时的 Bean 实例里的属性上、非构造方法上如果有 @Autowired,还没有进行依赖注入。

1.4.2.2 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)
请求 CommonAnnotationBeanPostProcessor 和 AutowiredAnnotationBeanPostProcessor,
扫描方法上是否有@PostConstruct @PreDestroy注解,有注解的封装成 LifecycleMetadata
扫描方法和属性上是否有@Resource注解
扫描方法和属性上是否有@Autowired @Value注解
对这些有注解的方法和属性封装成 InjectionMetadata

本节重点
本节的方法 populateBean 实现了对有 @Autowired 和 @Resource 的属性和非构造方法进行依赖注入。

无论是 CommonAnnotationBeanPostProcessor 还是 AutowiredAnnotationBeanPostProcessor,类的内部都有一个 map 来存储 InjectionMetadata

private final transient Map<String, InjectionMetadata> injectionMetadataCache = new ConcurrentHashMap<>(256);

populateBean 这个方法正是从这个缓存里拿到的 InjectionMetadata,进而通过 InjectionMetadata 里的信息来进行依赖注入。当然,注入的实例会进行优先实例化。

跟源码
类 AbstractAutowireCapableBeanFactory

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
   
   
	if (bw == null) {
   
   
		if (mbd.hasPropertyValues()) {
   
   
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
		}
		else {
   
   
			// Skip property population phase for null instance.
			return;
		}
	}

	// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
	// state of the bean before properties are set. This can be used, for example,
	// to support styles of field injection.
	boolean continueWithPropertyPopulation = true;

	//这里很有意思,写接口可以让所有类都不能依赖注入
	if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
   
   
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
   
   
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
   
   
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
   
   

					//是否需要DI,依赖注入
					continueWithPropertyPopulation = false;
					break;
				}
			}
		}
	}

	if (!continueWithPropertyPopulation) {
   
   
		return;
	}

	//不看
	PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值