一、概念
bean 的 后置处理器允许在调用 初始化方法前后 对 bean 进行额外的处理。
注意:bean 的后置处理器会对 IOC 容器里的所有的 bean 实例逐一进行处理,而非单一实例!
二、实现后置处理器
bean 的后置处理器需要实现接口:org.springframework.beans.factory.config.BeanPostProcessor
这个接口中有两个方法需要实现,在初始化方法被调用前后, Spring 将把每个 bean 实例分别传递给上面接口中的两个方法。
实现bean 的后置处理器:
/**
* 1、编写后置处理器的实现类
* 2、将后置处理器注册到【配置文件中】
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* postProcessBeforeInitialization
* 初始化之前调用
*
* Object bean:将要初始化的bean
* String beanName:就是在 xml 中配置的 id
*
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization" + "【"+ beanName +"】" + "bean将要调用初始化方法了。。。这个bean是这样的:" + "【"+ bean +"】" );
//返回传入的 bean
return bean;
}
/**
* postProcessAfterInitialization
* 初始化方法之后调用
*
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization" + "【"+ beanName +"】" + "bean初始化方法调用完毕了。。。");
//初始化之后返回的 bean,返回的是什么,容器中保存的就是什么
return bean;
}
}
配置:
<!--
Spring 有一个接口:后置处理器,可以在 bean 的初始化前后调用方法
-->
<bean id="myBeanPostProcessor" class="com.njf.spring.bean.MyBeanPostProcessor"></bean>
测试代码:
/**
* 后置处理器:
*
* (容器启动)构造器 —>后置处理器before方法 —> 初始化方法 —> 后置处理器的after方法
* 无论bean是否有初始化方法;后置处理器都会工作,默认其有,还会继续工作
*/
@Test
public void test9() {
ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("ioc3.xml");
Object bean = ioc.getBean("book001");
System.out.println(bean);
ioc.close();
}
三、添加 bean 的后置处理器后的 bean 的生命周期
① 通过构造器或工厂方法创建 bean 实例;
② 为 bean的属性设置值和对其他 bean 的引用;
③ 将 bean 实例传递给 bean 后置处理器的 postProcessAfterInitialization() 方法;
④ 调用 bean 的初始化方法;
⑤ 将 bean 实例传递给 bean 后置处理器的 postProcessBeforeInitialization() 方法;
⑥ 使用操作 bean;
⑦ 当容器关闭时调用 bean 的销毁方法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库