BeanDefinitionRegistryPostProcessor--- Spring源码从入门到精通(二十八)

简介: BeanDefinitionRegistryPostProcessor--- Spring源码从入门到精通(二十八)

上篇文章介绍了BeanFactoryPostProcessor接口,在bean创建对象之前,如何执行的:

BeanFactoryPostProcessor--- Spring源码从入门到精通(二十七)


这篇文章主要介绍他的子接口:

beanDefinitionRegisterPostProcessor:所有bean的定义信息将要被加载,在bean创建对象之前调用。


和上篇文章的BeanFactoryPostProcessor不同,上篇文章是:所有bean的定义信息已经加载进入beanFactory里,在bean创建对象之前调用。


其实从源码中我们也可以看到,beanDefinitionRegisterPostProcessor是extends BeanFactoryPostProcessor,所以定义类实现他的方法,重写子类的方法在重写父类的方法之前调用。


所以在beanFactoryPostProcessor之前调用,调用完之后,bean的定义信息在被加载进入beanFactory里。


并且以后beanFactory创建的对象,都是根据beanDefinitionRegister定义的信息创建的,用当前接口也能手动注册一个bean进入容器      


一、代码实现


/**
 * @author keying
 */
@Component
public class MyBeanDefinitionRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {
    /**
     * beanFactory里的bean创建,就是按照BeanDefinitionRegistry定义的bean信息创建的
     * @param registry
     * @throws BeansException
     */
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        int count = registry.getBeanDefinitionCount();
        System.out.println("当前beanDefinitionRegistry几个 bean:" + count);
        String beanName = "registerBean";
        //下面两个方法效果都是一样的:注册一个bean
        //RootBeanDefinition rootBeanDefinition =  new RootBeanDefinition(Dog.class);
        AbstractBeanDefinition rootBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Dog.class).getBeanDefinition();
        registry.registerBeanDefinition(beanName, rootBeanDefinition);
    }
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        int count = beanFactory.getBeanDefinitionCount();
        System.out.println("beanDefinitionRegistry当前beanFactory几个 bean:" + count);
    }
}

junitTest和上篇文章一样不变,为了方便理解再贴一次:

 @Test
    public void test() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
        applicationContext.close();
    }

从控制台打印可以看到,自己注册的bean对象成功注入容器,并且beanDefinitionRegistryPostProcessor的方法是在beanFactoryPostProcessor方法之前执行的:

image.png

二、源码跟踪


从打断点可以看到

  1. 第一步创建ioc容器,
  2. Refresh()
  3. InvokeBeanFactoryPostProcessor方法。

image.png

A、按类型,从beanFactory中获取到BeanDefinitionRegisterPostProcessor组件。依次循环触发postProcessorBeanDefinitionResgistry。B、按类型再从bean工厂按类型获取BeanProcessorBeanFactory。依次循环触发postPorcessorBeanFactory方法。

image.png

   

image.png

相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
1月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
1天前
|
存储 安全 Java
Spring Security 入门
Spring Security 是 Spring 框架中的安全模块,提供强大的认证和授权功能,支持防止常见攻击(如 CSRF 和会话固定攻击)。它通过过滤器链拦截请求,核心概念包括认证、授权和自定义过滤器。配置方面,涉及密码加密、用户信息服务、认证提供者及过滤器链设置。示例代码展示了如何配置登录、注销、CSRF防护等。常见问题包括循环重定向、静态资源被拦截和登录失败未返回错误信息,解决方法需确保路径正确和添加错误提示逻辑。
Spring Security 入门
|
25天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
46 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
22天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
41 2
|
22天前
|
Java 数据库连接 数据库
从入门到精通---深入剖析Spring DAO
在Java企业级开发中,Spring框架以其强大的功能和灵活性,成为众多开发者的首选。Spring DAO(Data Access Object)作为Spring框架中处理数据访问的重要模块,对JDBC进行了抽象封装,极大地简化了数据访问异常的处理,并能统一管理JDBC事务。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring DAO,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
21 1
|
26天前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
47 5
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
67 9
|
2月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
168 5
|
2月前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)