• 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
  • 相关阅读:
    《进化优化》 第2章 优化
    【附源码】计算机毕业设计JAVA抑抑心理交流平台
    如何使用滚动字幕为视频增添动态效果?
    Java泛型
    【python】(二十) python装饰器
    Aspose.Words使用教程之从零创建OOXML图表
    Milvus踩坑笔记
    460. LFU 缓存
    Linux内核CPU调度域内容讲解
    一文搞定JVM常见工具和优化策略
  • 原文地址:https://blog.csdn.net/qq_35529931/article/details/127954954