Spring IOC 后置处理器

spring源码:九大后置处理器 目的: spring在完成一个bean的初始化、实例化的过程中,会用到九个后置处理器;本文梳理出这九个后置处理器 九大后置处理器 spring在初始化的过程中,会在九个地方分别调用了五个后置处理的九个方法 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation InstantiationAwareBeanPostProcessor --& 阅读详情

#博学谷IT学习技术支持#

简介

之前的章节,看了AbstractApplicationContext的refresh()中的beanDefinitions创建过程和beanFactory的准备工作。这一章节,我们一起来看下一些后置处理器。
后置处理器大家应该都听说过,Spring框架中,很多的自定义扩展都是使用后置处理器来实现的。
首先来看下后置处理有哪些:
重要分为两大类:
1.BeanFactoryPostProcessor:与BeanFactory相关的后置处理器。这个接口只有一个方法postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory),会传入beanFactory,可以针对于beanFactory做一些操作。下面会有BeanDefinitionRegistryPostProcessor,就是继承了BeanFactoryPostProcessor
2.BeanPostProcessor:与Bean相关的后置处理器。该接口有两个方法postProcessBeforeInitialization(Object bean, String beanName)和postProcessAfterInitialization(Object bean, String beanName)。
postProcessBeforeInitialization方法在创建Bean之前执行,postProcessAfterInitialization会在Bean创建后执行。实现这个接口的后置处理器,主要针对于Bean去做一些处理拓展工作。

postProcessBeanFactory方法

该方法在AbstractApplicationContext类型是空实现,交给子类来进行重写。该方法也是用于自定义处理BeanFactory的。

invokeBeanFactoryPostProcessors方法

调用BeanFactoryPostProcessor。看下代码

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		// 调用BeanFactoryPostProcessor
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
		// 以下代码主要是判断是否需要加载时织入,需要的话添加LoadTimeWeaverAwareProcessor后置处理器和临时类加载器,这块代码暂时不做介绍。有兴趣的可以去查找下资料
		if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
	}

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

方法内部看着代码比较多,但是逻辑性对比较单一,还是比较好理解的

	public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

		Set<String> processedBeans = new HashSet<>();
		// 判断beanFactory是否为 BeanDefinitionRegistry子类
		if (beanFactory instanceof BeanDefinitionRegistry) {
			// 强转为BeanDefinitionRegistry
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

			// 遍历传递过来的beanFactoryPostProcessors
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				// 如果postProcessor是否BeanDefinitionRegistryPostProcessor接口子类的话
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					// 强转为BeanDefinitionRegistryPostProcessor
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
					// 调用 BeanDefinitionRegistryPostProcessor 后置处理器的postProcessBeanDefinitionRegistry方法
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					// 添加到registryProcessors集合中
					registryProcessors.add(registryProcessor);
				}
				else {
					// 如果postProcessor 不是BeanDefinitionRegistryPostProcessor的子类,直接添加到regularPostProcessors列表中
					regularPostProcessors.add(postProcessor);
				}
			}

			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

			//根据BeanDefinitionRegistryPostProcessor类型去查找beanNames
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			// 遍历postProcessorNames,ppName就是每个匹配到的BeanDefinitionRegistryPostProcessor后置处理器的beanName
			for (String ppName : postProcessorNames) {
				/**
				 * 判断当前ppName对应的Bean是否实现了PriorityOrdered接口
				 * PriorityOrdered: 实现了Ordered接口,优先级比Ordered接口要高,因此会先处理实现了改接口的后置处理器
				 * Ordered: 这个接口是Spring中的排序接口,通过getOrder获取排序顺序,值越小,优先级越大
				 */
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					// 获取对应的Bean,并放入currentRegistryProcessors列表中
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			// 根据优先级顺序排序
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			// 将排序后的列表放入registryProcessors列表中
			registryProcessors.addAll(currentRegistryProcessors);
			// 执行后置处理逻辑,其实就是调用BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
			// 执行完后将currentRegistryProcessors列表清空
			currentRegistryProcessors.clear();

			// 和上述步骤一样不过这次是获取的实现Ordered接口的BeanDefinitionRegistryPostProcessor Beans
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
			currentRegistryProcessors.clear();

			/**
			 * 执行完实现了PriorityOrdered和Ordered 接口的处理器,开始执行没有实现这两个排序接口的后置处理器
			 */
			boolean reiterate = true;
			while (reiterate) {
				reiterate = false;
				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
					if (!processedBeans.contains(ppName)) {
						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
						processedBeans.add(ppName);
						reiterate = true;
					}
				}
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				registryProcessors.addAll(currentRegistryProcessors);
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
				currentRegistryProcessors.clear();
			}

			/**
			 * 因为BeanDefinitionRegistryPostProcessor接口也继承了BeanFactoryPostProcessor,
			 * 因此这里会再次调用这些后置处理器的postProcessBeanFactory方法
			 */
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

		else {
			// 判断beanFactory不是 BeanDefinitionRegistry子类,则只执行传入的beanFactoryPostProcessors
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
		}

		// 和上述逻辑很相似,不过这里获取的是BeanFactoryPostProcessor
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
		
		// 先处理实现了PriorityOrdered接口的BeanFactoryPostProcessor,然后Ordered,然后其他
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {
			if (processedBeans.contains(ppName)) {
			}
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// 排序
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		// 先调用实现了PriorityOrdered接口的BeanFactoryPostProcessor
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

		// 调用实现了Ordered接口的BeanFactoryPostProcessor
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		// 执行其他的BeanFactoryPostProcessor
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
		
		// 清理缓存
		beanFactory.clearMetadataCache();
	}

这里要说下,前面说了后置处理器主要有BeanFactoryPostProcessor和BeanPostProcessor,但是这个方法BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor是分开处理的,相当于在Spring框架层面,BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor属于两种类型的后置处理器。但是因为BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor,这里我也就将BeanDefinitionRegistryPostProcessor归于了BeanFactoryPostProcessor。

registerBeanPostProcessors

	public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

		// 先根据BeanPostProcessor类型查找beanNames
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

		// 记录数量
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		/**
		 * 这里也是分为PriorityOrdered,Ordered和其他
		 * 多了一个internalPostProcessors,存放的是MergedBeanDefinitionPostProcessor类型的后置处理器
		 * 其实我们就可以把这个想象成前面的BeanDefinitionRegistryPostProcessor
		 */
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				// 根据beanName和类型获取相应的Bean
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// 先排序priorityOrderedPostProcessors
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		// 注册后置处理器
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// 获取orderedPostProcessors中beanName对应的Bean,并将MergedBeanDefinitionPostProcessor类型的处理器放入internalPostProcessors
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String ppName : orderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		// 排序orderedPostProcessors
		sortPostProcessors(orderedPostProcessors, beanFactory);
		// 注册后置处理器
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		// 最后处理其他没实现排序接口的BeanPostProcessor
		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String ppName : nonOrderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			nonOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

		// 排序
		sortPostProcessors(internalPostProcessors, beanFactory);
		// 注册
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

		// 将检测内部bean的后处理器重新注册为applicationlistener,将它移动到处理器链的末端
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

这样关于BeanFactoryPostProcessor后置处理器的调用和BeanPostProcessor后置处理器的注册就看完了。又不懂或这有问题不全面的地方,请大家积极指出。

Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理 前言 上一篇分析了BeanFactoryPostProcessor的作用,那么这一篇继续在refresh()方法里游荡,相信对Spring熟悉点的朋友,在看完BeanFactoryPostProcessor后,一定会想到Spring里面还有个BeanPostProcessor,那这个东西是什么作用呢?下面会进行介绍,同时由于注册BeanPostProcessor的逻辑比较简单,这里会穿插一下BeanPostProcessor生效的时机和源码逻辑,实际上这部分应该是Bean实例化出现的逻辑。 介绍完这部分 阅读详情

相关推荐

uniapp 开发微信小程序请求问题 , 真机调试正常,开发工具正常,但是使用扫码预览接口都是不通的,发布到体验版也是请求失败

uniapp开发小程序体验版接口请求失败(真机可以)

weixin_60408555的博客 3954

Spring的哪些后置处理器

9、ApplicationListenerDetector 主要处理Event事件发布和监听的后置处理器,在监听者实例化的时候,会把所有的监听者加到集合中,在发布消息的时候,会遍历监听者集合,判断是否是指定事件的监听者。10、LoadTimeWeaverAwareProcessor 处理AspectJ的,这个AspectJ和我们平时切面里面的AspectJ不是一个东西,这种是通过类加载期织入。4、AutowiredAnnotationBeanPostProcessor(自动装配后置处理器)

weixin_37862824的博客 436

PyTorch、Torchvision、Torchaudio历史版本whl文件下载地址、版本对应关系与离线安装全攻略

本文详细解析了PyTorch、Torchvision和Torchaudio历史版本whl文件的下载地址、版本对应关系及离线安装全攻略。针对无网络环境下的安装挑战,提供了官方whl文件获取路径、版本匹配技巧和完整安装流程,帮助开发者高效解决兼容性问题,确保深度学习环境的稳定部署。

weixin_31960565的博客 378

Spring的后置处理器

Spring的后置处理器是Spring对外开发的重要扩展点,允许我们介入到Bean的整个实例化流程中来,以达到动态注册。BeanDefinition,动态修改BeanDefinition,以及动态修改Bean的作用。BeanFactoryPostProcessor:Bean工厂后处理器,在BeanDefinitionMap填充完毕,Bean实例化之前执行;只执行一次;BeanDefinitionMap填充完毕后。

qq_53519086的博客 814

如何实现电路级别的CDM ESD防护

采用先进制程的CMOS工艺,可能具有比以前更薄的栅极氧化物和更大的芯片尺寸,大的衬底可能积累大量的电荷,导致CDM事件期间的高ESD放电峰值电流。传统CDM保护器件使用栅极接地NMOS被添加到输入级的栅极。然而,这种方法通常会在信号路径上引入显著的寄生电容,这不适合RF应用。

weixin_42693135的博客 2502

SAP高级外币评估_FINS_FXV_S4 2022 OP

摘要:S/4HANA 2022 On-Premise中的高级外币评估(FINS_FXV)取代了经典外币估值(FAGL_FCV),提供更优化的财务结算功能。主要创新包括:增量发布逻辑、简化账户配置、行项目级估值可见性等。该功能支持IFRS9等会计准则,通过会计原则(Accounting Principle)进行配置,需完成财务报表版本定义、语义标记分配等必要设置。系统演示展示了从汇率维护(FB60/MIRO)、测试运行到最终过账(FB03)的完整流程,能自动计算并过账汇率差异。高级外币评估简化了期末结算操作,

yanzibing99的博客 1259

spring 的后置处理器

spring的后置处理器 spring提供了三种后置处理器 BeanFactoryPostProcessor BeanPostProcessor InitializingBean 我们来依次看每个后置处理器的执行流程。 BeanFactoryPostProcessor 首先还是回到refresh方法中,我们可以看到在创建普通bean对象的上面有个方法叫invokeBeanFactoryPostProcessor,从方法名就可以看出是执行BeanFactoryPostProcessor方法 .

qwer123451234123的博客 5653

【实战指南】RF-DETR目标检测全流程:从数据准备到工业部署

本文详细介绍了RF-DETR目标检测模型的全流程应用,从数据准备、模型训练到工业部署。RF-DETR作为基于Transformer的先进模型,在COCO基准测试中表现优异,推理速度超越YOLOv8,特别适合工业场景。文章还提供了数据标注、COCO格式转换、超参数调优及边缘设备部署的实用技巧,帮助开发者高效实现目标检测任务。

weixin_29081101的博客 421

深入探索Spring后置处理器:解析作用与实际应用场景

BeanDefinitionRegistryPostProcessor BeanFactoryPostProcessor InstantiationAwareBeanPostProcessor BeanPostProcessor是spring生命周期中常见的4个后置处理器,但是对于其作用和执行顺序很多人还不是非常清楚,这里给大家讲解一下其作用以及执行顺序,并带上实操。

Apple_Boy的博客 2897

【生成C01/C10材料常数excel表】

计算橡胶件的邵尔硬度和C01/C10材料常数

weixin_46153372的博客 1932

TIA博途选型工具Selection Tool的基本使用方法介绍

TIA博途选型工具Selection Tool的基本使用方法介绍

Robot_PLC_HMI_Automation 4209

Spring IOC容器管理Bean的生命周期以及bean的后置处理器

bean的后置处理器Spring IOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。Spring IOC容器对Bean的生命周期进行管理的过程如下:通过构造器或工厂方法创建Bean实例为Bean的属性设置值和对其他Bean的引用调用Bean的初始化方法(init-method)Bean可以使用了当容器关闭时,调用Bean的销毁方法(destory-me...

u010512429的博客 1701

在 SAP BTP 中通过 MTA 自动创建 Service Broker 的原理与实战

本文探讨了如何在SAP BTP的Cloud Foundry环境中通过MTA部署自动创建和注册Service Broker。传统手动注册方式存在依赖管理员、环境一致性差等问题。通过MTA部署可实现自动化Broker注册,利用占位符生成安全凭证,并确保平台端与应用端认证一致。文章详细解析了关键配置参数,包括create-service-broker标志、Broker名称、认证凭据和访问URL的设置方法。这种基础设施即代码(IaC)方式能提升DevOps实践水平,使服务注册成为应用部署流水线的有机组成部分。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 200

Spring IOC容器核心机制:Bean后置处理器注册全解析

本文深入解析Spring框架中registerBeanPostProcessors阶段的核心作用与实现机制。作为IOC容器启动的关键步骤,该阶段通过三级优先级系统注册Bean后置处理器,支撑了依赖注入、AOP代理和生命周期回调等核心功能。

张小洛的BOLG 819

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring学习:IOC后置处理器BeanFactoryPosProcessor

BeanFactoryPosProcessor后置处理器,也称之为IOC容器后置处理器。他作用于IOC容器中的Bean创建之前(实例化之前),其主要用途为转换器的加载。他在IOC容器中的生命周期如下图所示: (一)BeanFactoryPosProcessor的实现类为IOC容器的后置处理器 IOC容器的后置处理器必须实现于接口BeanFactoryPosProcessor,实现类中需重写方法postProcessBeanFactory方法。IOC后置处理器常用于注册转换器,具体示例代码如下: // T

给时光以文明 338

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring学习:IOC后置处理器BeanPosProcessor

一、Spring:BeanPosPrecessor简介: Bean后处理器用来对bean的功能进行扩展增强,对IoC容器中的所有bean都有效。BeanPosProcessor后置处理器执行的时机为:在Bean实例化且装配数据后,在执行初始化前后,生命周期如图所示: 二、实现步骤 定义一个类,实现BeanPostProcessor接口 将该后处理器添加到IoC容器中 三、代码实现: 此实例为:自定义一个用户类,用户的属性为字符串数据类型,在IOC容器实例化后,给此Bean装配数据,装配数据后的Bean

给时光以文明 328

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring IOC高级特性:lazy-Init 延迟加载、FactoryBean 和 BeanFactory、后置处理器

Spring IOC高级特性:lazy-Init 延迟加载、FactoryBean 和 BeanFactory、后置处理器 1、 lazy-Init 延迟加载 Bean的延迟加载(延迟创建) ApplicationContext 容器的默认行为是在启动服务器时将所有 singleton bean 提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext 实例会创建并配置所有的singleton bean。 比如: <bean id="testBean" class=

丿涛哥哥的博客 804

Spring IOC源码:invokeBeanFactoryPostProcessors 后置处理器详解

本篇文章讲解了refresh方法中的prepareBeanFactory、postProcessBeanFactory、invokeBeanFactoryPostProcessors这三个方法。prepareBeanFactory其实就是BeanFactory工厂做一些准备工作,忽略某些值不被其它类所注入,以及添加一些后置处理器等。

猪大肠的博客 517

从源码角度深入剖析Spring Bean对象创建过程中各后置处理器的作用与实现原理

spring bean生命周期,BeanDefinitionRegistryPostProcessor、MergedBeanDefinitionPostProcessor、InstantiationAwareBeanPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor

qq_26733517的博客 552

spring框架源码十三、spring ioc高级特性-后置处理器

spring提供了两种后置处理bean的扩展接口,分别为BeanPostProcessor和BeanFactoryPostProcessor, BeanPostProcessor提供了两个方法,分别在初始化方法之前和之后执行, 这里的初始化方法就是bean的init-method。 如果我们定义了一个BeanPostProcessor的实现类,默认会对spring ioc容器中的所有bean进行处理, 如果要对某个具体的bean进行处理, 可以通过方法的参数(Object bean, String bean

CaptainCats的博客 648

【Spring【IOC】】——11、了解BeanPostProcessor后置处理器

BeanPostProcessor在Spring中是一个很强大的后置处理器接口,常用于注解处理,比如我们常用的@Value本质就是用这个后置处理器处理,那么BeanPostProcessor长的是什么样子的呢?代码如下。

zhouhengzhe的博客 1034

Spring IOC 05 创建带有生命周期的bean、bean的后置处理器

1、创建带有生命周期的bean,生命周期:bean的创建到销毁 (1)在Book类中添加以下两个方法: public class Book { public void myinit(){ System.out.println("图书初始化方法。。。"); } public void myDestory(){ System.out.println("图书销毁方法。。。"); } } (2)在ioc.xml配置文件中添加bean 可以为bea

qq_43312706的博客 168

spring源码解析-IoC容器的后置处理器源码分析

spring源码解析-IoC容器启动时刷新阶段-invokeBeanFactoryPostProcessors方法分析

weixin_42145727的博客 357

spring后置处理器对bean的处理逻辑

ApplicationListenerDetector:事件监听器的后置处理器

编码爱好者 408

Spring IOC高级特性(lazy-Init 延迟加载,FactoryBean,后置处理器)

Spring IOC高级特性(lazy-Init 延迟加载,FactoryBean,后置处理器) 文章内容输出来源:拉勾教育Java高薪训练营 看前可以先阅读上一篇文章:详解Spring IOC 1. lazy-Init 延迟加载 Bean的延迟加载(延迟创建) ApplicationContext 容器的默认行为是在启动服务器时将所有 singleton bean 提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext 实例会创建并配置所有的singleton bea

weixin_43871142的博客 271

Spring核心——注解的后置处理器

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33670713的博客 707
上一篇: Spring IOC prepareBeanFactory()
薛定谔的 bug
博客等级 码龄7年 9粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值