今天给大家介绍BeanPostProcessor接口用法,希望对大家能有所帮助! 1、BeanPostProcessor概念介绍 BeanPostProcessor接口通常被称为Bean的后置处理器,它是Spring中定义的接口,可以在Spring容器的创建过程中(主要在Bean初始化前后进行工作)回调BeanPostProcessor中定义的两个方法。2、BeanPostProcessor接口方法 postProcessBeforeInitialization:在每一个bean对象的初始化方法调用之前回调。 postProcessAfterInitialization:在每个bean对象的初始化方法调用之后被回调。 说明:以上两个方法的返回值都不能为null,否则在后续的初始化方法会报空指针或者通过getBean()方法无法获取Bean对象。主要原因是如果返回值为null的情况下以上两个方法从Spring容器获取bean实例,没有再次放入Spring容器中去,这样容器中就没有了。2。1BeanPostProcessor源码内容packageorg。springframework。beans。factory。importorg。springframework。beans。BeansEimportorg。springframework。lang。NpublicinterfaceBeanPostProcessor{NullabledefaultObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{}NullabledefaultObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{}}3、BeanPostProcessor接口的作用 可以Spring容器中完成bean实例化、配置以及其他初始化方法前后根据业务的场景增加相应的逻辑处理。典型的案例AOP的实现。4、代码示例4。1新建Person。java类文件packagecom。spring。publicclassPerson{privateSprivateIprivateSpublicPerson(Stringname,Integerage,Stringaddress){this。this。this。}publicPerson(){}publicStringgetName(){}publicvoidsetName(Stringname){this。}publicIntegergetAge(){}publicvoidsetAge(Integerage){this。}publicStringgetAddress(){}publicvoidsetAddress(Stringaddress){this。}OverridepublicStringtoString(){returnPerson{namename,ageage,addressaddress};}}4。2、新建MyBeanPostProcessor。javapackagecom。spring。importorg。springframework。beans。BeansEimportorg。springframework。beans。factory。config。BeanPostPimportorg。springframework。stereotype。CComponentpublicclassMyBeanPostProcessorimplementsBeanPostProcessor{实例化、依赖注入完毕,在调用显示的初始化之前完成一些自定义的初始化逻辑方法返回值不能为null返回null那么在后续初始化方法会报空指针异常或者通过getBean()方法获取不到bena实例如果设置为null情况下,后置处理器从SpringIoC容器中取出bean实例对象没有再次放回IoC容器中publicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{System。out。println(postProcessBeforeInitialization执行了beanName);}实例化、依赖注入、初始化完成后时执行方法返回值也不能为null如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象如果设置为null情况下,后置处理器从SpringIoC容器中取出bean实例对象没有再次放回IoC容器中publicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{System。out。println(postProcessAfterInitializationbeanName);}}4。3、新建TestBeanPostProcessorConfig。java配置类packagecom。spring。importcom。spring。bean。UserIimportorg。springframework。context。annotation。ComponentSimportorg。springframework。context。annotation。Cimportorg。springframework。context。annotation。FilterTimportorg。springframework。stereotype。Cimportorg。springframework。stereotype。CConfigurationComponentScan(valuecom。spring。bean,includeFilters{ComponentScan。Filter(typeFilterType。ANNOTATION,classes{Component。class,Controller。class}),ComponentScan。Filter(typeFilterType。ASSIGNABLETYPE,classes{UserInfo。class}),})publicclassTestBeanPostProcessorConfig{}4。4、新建测试类TestBeanPostProcessor。javapackagecom。spring。importcom。spring。config。TestBeanPostProcessorCimportorg。springframework。context。annotation。AnnotationConfigApplicationCpublicclassTestBeanPostProcessor{publicstaticvoidmain(String〔〕args){AnnotationConfigApplicationContextannotationContextnewAnnotationConfigApplicationContext(TestBeanPostProcessorConfig。class);}} 输出结果:postProcessBeforeInitialization执行了testBeanPostProcessorConfigpostProcessAfterInitializationtestBeanPostProcessorConfigUserInfo构造器执行了postProcessBeforeInitialization执行了userInfoPostConstruct初始化方法执行postProcessAfterInitializationuserInfoProcessfinishedwithexitcode0