IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring扩展机制之InstantiationAwareBeanPostProcessor -> 正文阅读

[Java知识库]Spring扩展机制之InstantiationAwareBeanPostProcessor

前言

spring中一个InstantiationAwareBeanPostProcessor接口,本文介绍下它的作用

介绍

InstantiationAwareBeanPostProcessor的定义

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

	org.springframework.beans.factory.support.AbstractBeanDefinition#getFactoryMethodName()
	 */
	@Nullable
	default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		return null;
	}

	
	default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		return true;
	}

	
	@Nullable
	default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
			throws BeansException {

		return null;
	}


	@Deprecated
	@Nullable
	default PropertyValues postProcessPropertyValues(
			PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {

		return pvs;
	}

}

postProcessBeforeInstantiation

调用链路,createBean方法开始
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
获取所有BeanPostProcessor,如果是InstantiationAwareBeanPostProcessor,则调用它的postProcessBeforeInstantiation

那么这个方法都用于哪些地方呢

比如你不想使用spring默认创建bean的方法通过构造器创建bean,比如Mybatis的Mapper,它只有接口,没有实现类的构造方法,postProcessBeforeInstantiation就是在spring使用构造器帮你创建bean之前创建对象的,你可以创建一个代理对象返回,那么就可以实现自定义实例化对象了
在这里插入图片描述
spring创建bean的地方是下面这个doCreateBean方法,当调用postProcessBeforeInstantiation返回对象时,就可以直接返回对象了,也就不会走到doCreateBean这个方法了

postProcessAfterInstantiation

调用链路,也是createBean开始,进入doCreateBean创建bean
在这里插入图片描述
进入依赖注入方法populateBean,在依赖注入之前,同样获取所有InstantiationAwareBeanPostProcessor,调用它的postProcessAfterInstantiation,如果返回值是false,那么就不进行下面的依赖注入流程了
在这里插入图片描述

也就是这个方法的触发逻辑是在,bean创建完成,依赖注入的过程前执行的

postProcessProperties

调用链路,这个方法同样在是依赖注入的方法populateBean中执行的,但是不同的是,它是在其他属性全部依赖注入完成后执行的
在这里插入图片描述
这个方法最常见的是配合MergedBeanDefinitionPostProcessor接口来使用,上文讲到了MergedBeanDefinitionPostProcessor可以用来收集类的某些属性或者字段

那么postProcessProperties这个方法,就可以对收集到的属性进行操作,比如:

AutowiredAnnotationBeanPostProcessor的postProcessProperties

public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
        // 获取之前MergedBeanDefinitionPostProcessor收集到的所有带了@Value的字段或者方法
		InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
		try {
		    // 进行处理
			metadata.inject(bean, beanName, pvs);
		}
		catch (BeanCreationException ex) {
			throw ex;
		}
		catch (Throwable ex) {
			throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
		}
		return pvs;
	}

metadata.inject里面会对收集到的字段,获取他们需要注入的属性,最终通过反射完成属性的注入

postProcessPropertyValues

这个方法在spring低版本中使用,在高版本已经过时了,使用postProcessProperties代替

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:33:07  更:2022-04-30 08:36:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:58:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码