iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring注解驱动之BeanDefinitionRegistryPostProcessor原理解析
  • 564
分享到

Spring注解驱动之BeanDefinitionRegistryPostProcessor原理解析

2024-04-02 19:04:59 564人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录BeanDefinitionReGIStryPostProcessor概述案例实践源码分析小结BeanDefinitionRegistryPostProcessor概述 可以看

BeanDefinitionRegistryPostProcessor概述

可以看到BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口。

注释中说执行时机是所有合法的bean定义已经加载,但是还没实例化。

看起来和BeanFactoryPostProcessor执行时机差不多,但是BeanFactoryPostProcessor的注释是所有bean定义被加载,而BeanDefinitionRegistryPostProcessor是所有合法的bean定义。

接着看注释:

This allows for adding further bean definitions before the next post-processing phase kicks in.

意思是BeanDefinitionRegistryPostProcessor允许添加将来的bean定义在下一个后置处理器阶段开始之前。简单说就是还可以往容器中增加新的bean的定义。

因此,大概率BeanDefinitionRegistryPostProcessor的执行顺序在BeanFactoryPostProcessor之前。

案例实践

首先,编写一个类,例如MyBeanDefinitionRegistryPostProcessor,它应要实现BeanDefinitionRegistryPostProcessor这个接口。

package com.meimeixia.ext;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.stereotype.Component;

import com.meimeixia.bean.Blue;

// 记住,我们这个组件写完之后,一定别忘了给它加在容器中
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("MyBeanDefinitionRegistryPostProcessor...bean的数量:" + beanFactory.getBeanDefinitionCount());
	}

	
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("postProcessBeanDefinitionRegistry...bean的数量:" + registry.getBeanDefinitionCount());
		// 除了查看bean的数量之外,我们还可以给容器里面注册一些bean,我们以前也简单地用过
		
		// RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class); // 现在我准备给容器中添加一个Blue对象
		// 咱们也可以用另外一种办法,即使用BeanDefinitionBuilder这个构建器生成一个BeanDefinition对象,很显然,这两种方法的效果都是一样的
		AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition();
		registry.registerBeanDefinition("hello", beanDefinition);
	}
}

测试结果

可以看到,BeanDefinitionRegistryPostProcessor里面的两个方法,postProcessBeanDefinitionRegistry在postProcessBeanFactory之前执行。

BeanDefinitionRegistryPostProcessor比BeanFactoryPostProcessor先执行。

源码分析

自己在测试示例中方法打断点,然后查看调用栈即可,下面是一些主要的代码片段。

继续向下看,可以看到会取出所有实现了BeanDefinitionRegistryPostProcessor接口的类,即从容器中获取到所有的BeanDefinitionRegistryPostProcessor组件。

然后,优先调用实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor组件。

点进去这个方法里面一看究竟,原来是先调用完BeanDefinitionRegistryPostProcessor组件里面的postProcessBeanDefinitionRegistry方法,然后再来调用它里面的postProcessBeanFactory方法。

我们再来仔细看一下PostProcessorRegistrationDelegate类中的invokeBeanFactoryPostProcessors方法,只不过这时是从程序停留的地方(即第122行代码处)往下看,如下图所示。

小结

BeanDefinitionRegistryPostProcessor的执行流程。

1. 创建ioc容器。

2. 调用refresh方法。

3. 从IOC容器中获取所有的BeanDefinitionRegistryPostProcessor组件,并依次触发它们的postProcessBeanDefinitionRegistry方法,之后触发它的postProcessBeanFactory方法。

4. 从IOC容器中获取到所有的BeanFactoryPostProcessor组件,并依次触发它们的postProcessBeanFactory方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Spring注解驱动之BeanDefinitionRegistryPostProcessor原理解析

本文链接: https://www.lsjlt.com/news/168743.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作