• spring bean生命周期三---Spring Bean populateBean阶段


    实例化Bean之后,就是对Bean的属性进行注入的过程。

    // 处理当前实例的依赖数据,依赖注入在这一步完成
    			populateBean(beanName, mbd, instanceWrapper);
    
    • 1
    • 2

    具体代码分析
    postProcessAfterInstantiation()方法,可以决定是否进行属性填充,只要有一个返回了false,都会终止属性填充的过程。

     //mbd.isSynthetic() 合成类
    		//todo 第五次---判断属性是否填充:InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
    		// 给InstantiationAwareBeanPostProcessor最后一次机会在属性设置前来改变bean
    		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    			for (BeanPostProcessor bp : getBeanPostProcessors()) {
    				if (bp instanceof InstantiationAwareBeanPostProcessor) {
    					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    						continueWithPropertyPopulation = false;
    						break;
    					}
    				}
    			}
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    自动装配:autowiring自动装配,根据ByName或者ByType。提取依赖的bean,并统一存入到 propertyValues 中。

     
        		 2. 自动装配 :autowiring自动装配的。根据名称或类型自动注入
    		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
    				mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
     
     
    			MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
     
    			// Add property values based on autowire by name if applicable.
    			//根据Bean名称进行autowiring自动装配处理
    			if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
    				autowireByName(beanName, mbd, bw, newPvs);
    			}
     
    			// Add property values based on autowire by type if applicable.
    			//根据Bean类型进行autowiring自动装配处理
    			if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
    				autowireByType(beanName, mbd, bw, newPvs);
    			}
     
    			pvs = newPvs;
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    @Autowired 和 @Resource 的注入工作主要是通过
    filterPropertyDescriptorsForDependencyCheck()方法

    PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    			if (hasInstAwareBpps) {
    				//TODO 获取的bean所有后置处理器找到 所有需要注入的属性
    				// 这里会进行 @Autowired 和 @Resource 的注入工作
    				// 属性填充InstantiationAwareBeanPostProcessor
    				for (BeanPostProcessor bp : getBeanPostProcessors()) {
    					if (bp instanceof InstantiationAwareBeanPostProcessor) {
    						InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    						//下面是完成属性注入的
    						pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
    						// 如果postProcessProperties 返回null,再调用 postProcessPropertyValues这个过时的方法
    						if (pvs == null) {
    							return;
    						}
    					}
    				}
    			}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    4、K8s控制器-Replicaset
    Sql 异常 + Error
    基于Simulink的用于电力系统动态分析
    acwing算法基础之基础算法--求逆序对的数目
    linux系统调用拦截Centos7.6(二)のSSH连接
    基于Matlab使用艾伦方差来确定MEMS陀螺仪的噪声参数(附源码)
    基于SSH的客车网上售票系统
    拿走不谢!头条上最细的SpringCloudAlibaba全彩版笔记开源
    ACM算法学习路线、清单
    python爬虫100例教程 python爬虫实例100例子
  • 原文地址:https://blog.csdn.net/qq_35529931/article/details/127954954