• 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
  • 相关阅读:
    如何获得淘宝商品详情高级版 API 数据接口
    2款Notepad++平替工具(实用、跨平台的文本编辑器)
    react native 使用阿里字体图标库
    java计算机毕业设计共享汽车管理系统MyBatis+系统+LW文档+源码+调试部署
    Stackelberg博弈数值仿真,下面的MATLAB代码问题出在哪里呢?
    Js进行base64编码、解码、中文乱码
    电商直播增加人气,留人技巧有哪些
    electron 创建圆角窗口附带阴影效果
    性能测试:系统架构性能优化思路
    算法金 | Python 中有没有所谓的 main 函数?为什么?
  • 原文地址:https://blog.csdn.net/qq_35529931/article/details/127954954