您现在的位置是:首页 >学无止境 >spring 学习( 实例化对象的具体过程 bean的处理器)网站首页学无止境

spring 学习( 实例化对象的具体过程 bean的处理器)

等什么君! 2026-05-14 12:01:04
简介spring 学习( 实例化对象的具体过程 bean的处理器)

前言

本篇博客 ,主要介绍 bean的处理器。可以结合,详解 bean 对象的生命周期 和实例化对象的具体过程-CSDN博客 

一起理解学习。

了解 实例化对象的具体过程

  1. 加载 spring.xml文件将bean 标签 ,封装成BeanDefinition
  2. 将这些BeanDefinition存放到BeanDefinitionMap内
  3. 遍历Map,得到Bean
  4. 将Bean存放到singletonObjects(单例池)
  5. 通过调用getBean方法得到bean

底层代码细节,同样可以参照 详解 bean 对象的生命周期 和实例化对象的具体过程-CSDN博客

  • 看图理解过程

bean 的处理器

概念:使用 bean 处理器,可以人为的干预 bean 实例化过程具体包括 动态添加、修改BeanDefinition,动态参与 bean 生命周期。

spring  主要有两者处理器 :一种是Bean工厂后处理器,另一种是Bean后处理器

根据作用 时机可以区别为:

Bean 工厂 后处理器 是在  遍历 beanDefinationMap 之前

Bean 后处理器 是在   遍历 beanDefinationMap 之后,调用 getBean 方法从 单例池 拿到 bean 之前。

根据用途可以区分为:

Bean工厂后处理器:使用 bean 后处理器可以人为的干预 bean 的创建历程

Bean 后处理器:使用 bean 后处理器可以人为的干预 bean 的生命周期

Bean工厂后处理器(BeanFactoryPostProcessor) 

BeanFactoryPostProcessor是一个接口规范,实现该接口的类只需交给Spring容器管理,spring就会调用该接口的方法;

验证 使用 bean 后处理器可以人为的干预 bean 的创建历程

1 可以动态修改 BeanDefinition

demo 案例

目的; 表面上创建 Agg 对象,但实际上打印的是Hen类对象,使用Bean工厂后处理器 实现偷梁换柱的效果

spring 配置文件

<!--   Bean 工厂后处理器-->
    <bean class="fs.BFFP" id="bffp"></bean>
    <bean class="fs.Hen" id="hen"></bean>
    <bean class="fs.Agg" id="agg"></bean>

Bean 工厂后处理器的接口实现类:BFFP

package fs;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

public class BFFP implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory BeanFactory) throws BeansException {
        BeanDefinition hen = BeanFactory.getBeanDefinition("agg");
        hen.setBeanClassName("fs.Hen");

    }
}

测试结果

2 动态注册beanDefinition 

原本创建对象的模式都是依赖 spring 配置文件 ,写成一个个bean 标签,交给 spring 容器 管理。但现在 我们不再依托 spring 配置文件,而是手动把 目标类注入 进 容器中,实现创建对象

操作步骤

  1. 创建一个beanDefinition对象(new RootBeanDefiniton())
  2. 用该对象设置类的全限定名(路径)
  3. 动态注册到BeanDefinitionMap中  (DefaultListableBeanFactory) 

demo 案例

目的: 手动 将 person 类 交给 spring 容器

Bean 工厂后处理器的接口实现类:BFFP

package fs;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;

public class BFFP implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory BeanFactory) throws BeansException {
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
        rootBeanDefinition.setBeanClassName("fs.Person");
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) BeanFactory;
        defaultListableBeanFactory.registerBeanDefinition("person", rootBeanDefinition);
    }
}

spring 配置文件

    <bean class="fs2.MyBp" id="myBp"></bean>
    <bean class="fs2.Student" id="student" >

测试结果

Bean后处理器(BeanPostProcessor)

 Bean后处理器也是一个接口,但是它的执行时间是对象创建之后,实现该接口需要重写两个方法,分别在bean的初始化前和初始化后执行:

验证 bean 后处理器可以人为的干预 bean 的生命周期

demo案例

目的:使用 teacher 类 和 student 类 演示 它们各自的使用 bean 后处理器的场景

spring 配置文件

<bean class="fs2.MyBp" id="myBp"></bean>
    <bean class="fs2.Student" id="student" init-method="ins">
    </bean>
    <bean class="fs2.Teacher" id="teacher" init-method="ins">

之后的  teacher 类 和 student 类 都各自重写 ins 初始化方法

MyBp 类是BeanPostProcessor 的实现类
package fs2;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBp implements BeanPostProcessor {
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 初始化后
        System.out.println("AfterInitialization 啦啦啦被执行了。。。。");
        return bean;

    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 初始化前
        System.out.println("BeforeInitialization 啦啦啦被执行了。。。。");
  return bean;
    }
}

Test 测试类

发现:可以看到执行顺序为 postProcessBeforeInitialization -> 对象初始化方法 -> postProcessAfterInitialization

现在补充 bean 实例化对象的样图

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。