Spring 后置处理器【1】 简单介绍
一句话:bean 在初始化前或初始化后的瞬间,我自己添加一些业务逻辑
bean 后置处理器类的内容
简单代码
package com.hspedu.spring.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* @Author:PigBrother
* @Date:2022/9/22
* @Description:ToDo
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* Before : 说明在bean 初始化前被调用
* @param bean 在ioc 容器中, 我配置的bean 对象
* @param beanName 在ioc 容器中,bean 的 id
* @return bean 返回处理后的bean 对象
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 写业务逻辑:在bean 初始化前,修改其一些属性
System.out.println("postProcessBeforeInitialization() 方法被调用");
System.out.println("bean = " + bean);
System.out.println("beanName = " + beanName);
return bean;
}
/**
* after : 说明在bean 初始化后被调用
* @param bean 在ioc 容器中, 我配置的bean 对象
* @param beanName 在ioc 容器中,bean 的 id
* @return bean 返回处理后的bean 对象
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 写业务逻辑:在bean 初始化前,修改其一些属性
System.out.println("postProcessAfterInitialization() 方法被调用");
System.out.println("bean = " + bean);
System.out.println("beanName = " + beanName);
return bean;
}
}
代码解读
- 实现 BeanPostProcessor 接口
- postProcessBeforeInitialization 和 postProcessAfterInitialization 两个方法
- 在两个方法中写业务逻辑
容器配置文件(即xml 文件)
测试代码
测试代码
@Test
public void beanProcessorTest() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans02.xml");
House house = ioc.getBean("house", House.class);
System.out.println(house);
// 关闭ioc 容器
((ClassPathXmlApplicationContext)ioc).close();
}
测试结果
Spring 后置处理器的简单应用
将容器内的所有bean的某一个属性的值统一改为另一个值
有 AOP 的一点影子了
将大豪宅改成香港豪宅
package com.hspedu.spring.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* @Author:PigBrother
* @Date:2022/9/22
* @Description:ToDo
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* Before : 说明在bean 初始化前被调用
* @param bean 在ioc 容器中, 我配置的bean 对象
* @param beanName 在ioc 容器中,bean 的 id
* @return bean 返回处理后的bean 对象
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 写业务逻辑:在bean 初始化前,修改其一些属性
System.out.println("postProcessBeforeInitialization() 方法被调用; 将所有豪宅改成香港豪宅");
if (bean instanceof House) {
House house = (House) bean;
house.setName("香港豪宅");
}
return bean;
}
/**
* after : 说明在bean 初始化后被调用
* @param bean 在ioc 容器中, 我配置的bean 对象
* @param beanName 在ioc 容器中,bean 的 id
* @return bean 返回处理后的bean 对象
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 写业务逻辑:在bean 初始化前,修改其一些属性
System.out.println("postProcessAfterInitialization() 方法被调用");
System.out.println("bean = " + bean);
System.out.println("beanName = " + beanName);
return bean;
}
}