您现在的位置是:首页 >学无止境 >spring 学习( 实例化对象的具体过程 bean的处理器)网站首页学无止境
spring 学习( 实例化对象的具体过程 bean的处理器)
前言
本篇博客 ,主要介绍 bean的处理器。可以结合,详解 bean 对象的生命周期 和实例化对象的具体过程-CSDN博客
一起理解学习。
了解 实例化对象的具体过程
- 加载 spring.xml文件将bean 标签 ,封装成BeanDefinition
- 将这些BeanDefinition存放到BeanDefinitionMap内
- 遍历Map,得到Bean
- 将Bean存放到singletonObjects(单例池)
- 通过调用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 配置文件,而是手动把 目标类注入 进 容器中,实现创建对象
操作步骤
- 创建一个beanDefinition对象(new RootBeanDefiniton())
- 用该对象设置类的全限定名(路径)
- 动态注册到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 实例化对象的样图






QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
U8W/U8W-Mini使用与常见问题解决
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结