Spring BeanPostProcessor接口使用详解
Spring中提供了很多PostProcessor供开发者进行拓展,例如:BeanPostProcessor、BeanFactoryPostProcessor、BeanValidationPostProcessor等一系列后处理器。他们的使用方式大多类似,了解其中一个并掌握他的使用方式,其他的可以触类旁通。
这里以BeanPostProcessor为例展示其使用方式。
BeanPostProcessor接口提供了两个供开发者自定义的方法:postProcessBeforeInitialization、postProcessAfterInitialization。
postProcessBeforeInitialization:该方法主要针对spring在bean初始化时调用初始化方法前进行自定义处理。
postProcessAfterInitialization:该方法主要针对spring在bean初始化时调用初始化方法后进行自定义处理。
示例代码:
/**
*测试bean
*/
publicclassCat{
privateStringname;
privateintage;
publicvoidsay(){
System.out.println("name:"+name);
System.out.println("age:"+age);
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
}
/**
*自定义后处理器
*/
publicclassCatBeanPostProcessorimplementsBeanPostProcessor{
@Nullable
@Override
publicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{
if(beaninstanceofCat){
//输出原始属性
Catcat=(Cat)bean;
cat.say();
returnbean;
}
returnbean;
}
@Nullable
@Override
publicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{
if(beaninstanceofCat){
//修改属性值,并返回
Catcat=(Cat)bean;
cat.setName("hellomaomi");
cat.setAge(3);
returncat;
}
returnbean;
}
}
/**
*运行
*/
publicclassRun{
publicstaticvoidmain(String[]args){
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring-bean.xml");
Catcat=(Cat)applicationContext.getBean("cat");
cat.say();
}
}
xml配置信息
输出结果:
name:HelloKitty
age:1
name:hellomaomi
age:3
可以看到通过后处理器处理过后的bean信息已经改变。最后,看看源码中如何调用自定义实现的。
在初始化bean方法中:AbstractAutowireCapableBeanFactory.java
/**
*初始化bean
*/
protectedObjectinitializeBean(finalStringbeanName,finalObjectbean,@NullableRootBeanDefinitionmbd){
//省略部分无关代码
ObjectwrappedBean=bean;
//初始化前
if(mbd==null||!mbd.isSynthetic()){
wrappedBean=applyBeanPostProcessorsBeforeInitialization(wrappedBean,beanName);
}
try{
//调用初始化方法初始化bean
invokeInitMethods(beanName,wrappedBean,mbd);
}
catch(Throwableex){
thrownewBeanCreationException(
(mbd!=null?mbd.getResourceDescription():null),
beanName,"Invocationofinitmethodfailed",ex);
}
//初始化后
if(mbd==null||!mbd.isSynthetic()){
wrappedBean=applyBeanPostProcessorsAfterInitialization(wrappedBean,beanName);
}
returnwrappedBean;
}
//postProcessBeforeInitialization方法调用
@Override
publicObjectapplyBeanPostProcessorsBeforeInitialization(ObjectexistingBean,StringbeanName)
throwsBeansException{
Objectresult=existingBean;
for(BeanPostProcessorbeanProcessor:getBeanPostProcessors()){
//调用自定义postProcessBeforeInitialization方法
Objectcurrent=beanProcessor.postProcessBeforeInitialization(result,beanName);
if(current==null){
returnresult;
}
result=current;
}
returnresult;
}
//postProcessAfterInitialization方法调用
@Override
publicObjectapplyBeanPostProcessorsAfterInitialization(ObjectexistingBean,StringbeanName)
throwsBeansException{
Objectresult=existingBean;
for(BeanPostProcessorbeanProcessor:getBeanPostProcessors()){
//自定义postProcessAfterInitialization方法调用
Objectcurrent=beanProcessor.postProcessAfterInitialization(result,beanName);
if(current==null){
returnresult;
}
result=current;
}
returnresult;
}
以上就是spring对自定义方法实现的调用过程。希望对大家的学习有所帮助,也希望大家多多支持毛票票。