Spring BeanPostProcessor接口使用详解
作者:zpwd63 时间:2022-12-18 09:19:36
Spring中提供了很多PostProcessor供开发者进行拓展,例如:BeanPostProcessor、BeanFactoryPostProcessor、BeanValidationPostProcessor等一系列后处理器。他们的使用方式大多类似,了解其中一个并掌握他的使用方式,其他的可以触类旁通。
这里以BeanPostProcessor为例展示其使用方式。
BeanPostProcessor接口提供了两个供开发者自定义的方法:postProcessBeforeInitialization、postProcessAfterInitialization。
postProcessBeforeInitialization:该方法主要针对spring在bean初始化时调用初始化方法前进行自定义处理。
postProcessAfterInitialization:该方法主要针对spring在bean初始化时调用初始化方法后进行自定义处理。
示例代码:
/**
* 测试bean
*/
public class Cat {
private String name;
private int age;
public void say() {
System.out.println("name:" + name);
System.out.println("age:" + age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/**
* 自定义后处理器
*/
public class CatBeanPostProcessor implements BeanPostProcessor {
@Nullable
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Cat) {
//输出原始属性
Cat cat = (Cat) bean;
cat.say();
return bean;
}
return bean;
}
@Nullable
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Cat) {
//修改属性值,并返回
Cat cat = (Cat) bean;
cat.setName("hello maomi");
cat.setAge(3);
return cat;
}
return bean;
}
}
/**
* 运行
*/
public class Run {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
Cat cat = (Cat) applicationContext.getBean("cat");
cat.say();
}
}
xml配置信息
<!--配置bean并初始化-->
<bean id="cat" class="com.source.postprocessor.Cat" >
<property name="name" value="HelloKitty" />
<property name="age" value="1" />
</bean>
<bean id="catBeanPostProcessor" class="com.source.postprocessor.CatBeanPostProcessor" />
输出结果:
name:HelloKitty
age:1
name:hello maomi
age:3
可以看到通过后处理器处理过后的bean信息已经改变。最后,看看源码中如何调用自定义实现的。
在初始化bean方法中:AbstractAutowireCapableBeanFactory.java
/**
* 初始化bean
*/
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
//省略部分无关代码
Object wrappedBean = bean;
//初始化前
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
//调用初始化方法初始化bean
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
//初始化后
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
//postProcessBeforeInitialization方法调用
@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
//调用自定义postProcessBeforeInitialization方法
Object current = beanProcessor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
//postProcessAfterInitialization方法调用
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
//自定义postProcessAfterInitialization方法调用
Object current = beanProcessor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
来源:https://www.jianshu.com/p/e1c3c6e90e8a
标签:Spring,BeanPostProcessor
0
投稿
猜你喜欢
android从系统图库中取图片的实例代码
2023-09-13 21:54:44
C#实现的阴历阳历互相转化类实例
2021-12-24 06:41:39
SpringMVC通过模型视图ModelAndView渲染视图的实现
2023-02-28 03:36:54
Android Studio 3.6 layout文件text模式切换问题
2022-10-06 11:28:32
Java 字符串反转实现代码
2023-01-09 10:04:52
Android开发实现popupWindow弹出窗口自定义布局与位置控制方法
2022-10-13 11:42:09
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2021-08-04 03:16:28
Hibernate实现批量添加数据的方法
2023-11-29 08:53:56
Collections.shuffle()方法实例解析
2021-09-17 18:51:38
深入android Unable to resolve target 'android-XX'详解
2023-05-29 13:21:33
java线程组构造方法源码解析
2022-11-24 08:58:26
Java面试题冲刺第十六天--消息队列
2022-08-08 09:07:04
Android 开发之dataBinding与ListView及事件
2023-10-13 21:14:28
Java案例使用比较排序器comparator实现成绩排序
2023-10-16 01:37:24
Java基于rest assured实现接口测试过程解析
2022-07-25 09:30:25
JDK10中的局部变量类型推断var
2022-06-16 20:32:48
C#实现创建,删除,查找,配置虚拟目录实例详解
2022-09-27 06:38:16
C语言简明讲解变量的属性
2021-06-23 17:45:28
Spring MVC请求参数接收的全面总结教程
2023-11-28 19:44:47
C#实现Word和ODT文档相互转换详解
2022-12-17 21:36:47