Spring生命周期中BeanPostProcessor接口用法介绍


prtyaa
prtyaa 2023-12-25 12:31:28 53949
分类专栏: 资讯

今天给大家介绍BeanPostProcessor接口用法,希望对大家能有所帮助!

 

 

1、BeanPostProcessor 概念介绍

BeanPostProcessor接口通常被称为Bean的后置处理器,它是Spring中定义的接口,可以在Spring容器的创建过程中(主要在Bean初始化前后进行工作)回调BeanPostProcessor中定义的两个方法。

2、BeanPostProcessor接口方法

postProcessBeforeInitialization:在每一个bean对象的初始化方法调用之前回调。

postProcessAfterInitialization:在每个bean对象的初始化方法调用之后被回调。

说明:以上两个方法的返回值都不能为null,否则在后续的初始化方法会报空指针或者通过getBean()方法无法获取Bean对象。主要原因是如果返回值为null的情况下以上两个方法从Spring容器获取bean实例,没有再次放入Spring容器中去,这样容器中就没有了。

2.1 BeanPostProcessor源码内容

package org.springframework.beans.factory.config; import org.springframework.beans.BeansException;import org.springframework.lang.Nullable; public interface BeanPostProcessor { @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; }}

 

 

3、BeanPostProcessor 接口的作用

可以Spring容器中完成bean实例化、配置以及其他初始化方法前后根据业务的场景增加相应的逻辑处理。典型的案例AOP的实现。

4、代码示例

4.1 新建Person.java 类文件

package com.spring.bean; public class Person { private String name; private Integer age; private String address; public Person(String name, Integer age, String address) { this.name = name; this.age = age; this.address = address; } public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age='" + age + '\'' + ", address='" + address + '\'' + '}'; }}

 

 

4.2、新建MyBeanPostProcessor.java

package com.spring.bean; import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.stereotype.Component; @Componentpublic class MyBeanPostProcessor implements BeanPostProcessor { /** * 实例化、依赖注入完毕,在调用显示的初始化之前完成一些自定义的初始化逻辑 * 方法返回值不能为null * 返回null那么在后续初始化方法会报空指针异常或者通过getBean()方法获取不到bena实例 * 如果设置为null情况下,后置处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中 */ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization执行了"+beanName); return bean; } /** * 实例化、依赖注入、初始化完成后时执行 * 方法返回值也不能为null * 如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象 * 如果设置为null情况下,后置处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中 */ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization"+beanName); return bean; }}

 

 

4.3、新建TestBeanPostProcessorConfig.java 配置类

package com.spring.config; import com.spring.bean.UserInfo;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.FilterType;import org.springframework.stereotype.Component;import org.springframework.stereotype.Controller; @Configuration@ComponentScan(value = "com.spring.bean",includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION , classes = {Component.class, Controller.class} ), @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE , classes = {UserInfo.class} ),})public class TestBeanPostProcessorConfig { }


 

4.4、新建测试类 TestBeanPostProcessor.java

package com.spring.test; import com.spring.config.TestBeanPostProcessorConfig;import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class TestBeanPostProcessor { public static void main(String[] args) { AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(TestBeanPostProcessorConfig.class); }} 输出结果: postProcessBeforeInitialization执行了testBeanPostProcessorConfigpostProcessAfterInitializationtestBeanPostProcessorConfigUserInfo构造器执行了postProcessBeforeInitialization执行了userInfoPostConstruct 初始化方法执行postProcessAfterInitializationuserInfo Process finished with exit code 0

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=30158
赞同 0
评论 0 条
prtyaaL2
粉丝 1 发表 2553 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2950
【软件正版化】软件正版化工作要点  2872
统信UOS试玩黑神话:悟空  2833
信刻光盘安全隔离与信息交换系统  2728
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1261
grub引导程序无法找到指定设备和分区  1226
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  165
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  163
点击报名 | 京东2025校招进校行程预告  163
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  159
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
如何玩转信创开放社区—从小白进阶到专家 15
信创开放社区邀请他人注册的具体步骤如下 15
方德桌面操作系统 14
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
我有15积分有什么用? 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!