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对自定义方法实现的调用过程。希望对大家的学习有所帮助,也希望大家多多支持毛票票。