Spring系列(八):Spring生命周期中BeanPostProcessor接口用法介绍

目录

1、BeanPostProcessor 概念介绍

2、BeanPostProcessor接口方法

2.1 BeanPostProcessor源码内容

3、BeanPostProcessor 接口的作用

4、代码示例

4.1 新建Person.java 类文件

4.2、新建MyBeanPostProcessor.java

4.3、新建TestBeanPostProcessorConfig.java 配置类

4.4、新建测试类 TestBeanPostProcessor.java


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

       c794e03e57784cf924ca1392071c1e4e.png        

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 {@Nullabledefault Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}@Nullabledefault 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;}@Overridepublic 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;@Component
public 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执行了testBeanPostProcessorConfig
postProcessAfterInitializationtestBeanPostProcessorConfig
UserInfo构造器执行了
postProcessBeforeInitialization执行了userInfo
PostConstruct 初始化方法执行
postProcessAfterInitializationuserInfoProcess finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统:Windows映射网络文件夹的方法介绍

大家在工作中我们经常需要访问局域网服务器的共享文件夹,并将共享文件夹做网络映射,映射之后就相当于是访问本地磁盘一样访问远程服务器的共享文件夹。那么如何做网络映射呢?我们以windows操作系统为例,给大家分享一下网络映射的方…

运维:分享四款非常好用的命令行软件

目录 1、终端程序 — Alacritty 2、Shell – Fish 3、终端复用 — Tmux 4、编辑器 — Vim 常言道,工欲善其事、必先利其器,熟练一套高效且趁手的工具,对开发工作的重要性不言而喻。 本文给大家分享下命令行开发环境,文章较长&…

开发工具:Git和SVN有哪些差异,看完你就懂了?

目录 Git vs SVN Git核心思想 Git-SVN常用命令 初始化 配置 增删文件 分支 提交 拉取 撤销 查询 Git或SVN相信很多搞技术的工程师都用过,不仅仅只有程序员才进行版本管理,机械、硬件、测试等其他岗位也有版本管理的需求。 早期用SVN的比较多,…

微信PC版近期更新的几个功能,你都会用吗?

目录 1、查找和添加微信号 2、截图识别二维码或小程序码 3・识别聊天窗口二维码和小程序码 4、左侧菜单栏新增搜一搜 5、发送文件时多出一个留言输入框 6、群聊邀请确认同步至PC端 7、视频号新增添加到桌面快捷方式 8、支持电脑开机时自动启动微信 9、微信电子身份证新功能上线…

Spring系列(九):Spring属性赋值注解@Value 用法介绍

目录 1、Value注解的作用 2、Value 注解的写法 3、用法示例 3.1 resources 目录新增 book.properties 配置文件 3.2 新增实体 Book.java 3.3 新增 TestValueConfig.java 3.4 新增 TestValue.java 测试文件 4、使用场景 今天给大家分享Spring属性赋值注解Value 用法&#xff0c…

Linux:9个实用shell运维脚本

目录 1、Dos攻击防范(自动屏蔽攻击IP) 2、Linux系统发送告警脚本 3、MySQL数据库备份单循环 4、MySQL数据库备份多循环 5、Nginx访问访问日志按天切割 6、Nginx访问日志分析脚本 7、查看网卡实时流量脚本 8、服务器系统配置初始化脚本 9、监控100台服务器…

Spring系列(十):@Autowired 和@Resource注解用法介绍

目录 一、Autowired 注解 1.1 介绍 1.2 作用 二、Resource 注解 2.1 介绍 2.2 Resource 自动注入顺序 三、Autowired 和 Resource区别 3.1 相同点: 3.2 不同点: 今天给大家分享Spring属性注入的注解Autowired 和Resource介,希望对大家能有所帮…

电脑软件:5个实用的Windows软件,大幅度提高你的工作效率

目录 软件一:投屏宝 软件二:Everything 软件三:uTools 软件四:Quicklook 软件五:CCleaner 今天小编给大家大家推荐这5款Windows必装的效率软件,实用又免费,可以大幅度提高你的工作效率。 软件一…

电脑软件:推荐八款提高工作效率的软件

目录 1、火绒杀毒软件 2、 Everything搜索神器 3、Bandizip压缩神器 ​​​​​​​4、Chrome浏览器 or 火狐 5、Snipaste 截图神器 6、geek卸载神器 7、vscode 代码编辑神器 8、Typora 今天小编给大家推荐八款提高工作效率的软件,欢迎下载试一试! 1、火…

centos7 安装 python3.5

centos7 安装 python3.5 一、 python虚拟环境virtualenv VirtualEnv用于在一台机器上创建多个独立的python运行环境,VirtualEnvWrapper为前者提供了一些便利的命令行上的封装。 Virtualenv是一个非常好的virtual python environment builder,他最大的好处…

手机知识:90Hz或120Hz屏幕刷新率有啥区别

目录 1、屏幕刷新率概念介绍 2、显示器的工作原理 3、60Hz,90Hz和120Hz有什么区别? 4、高屏幕刷新率的缺点 5、你是否需要90Hz或120Hz的刷新率 今天小编给大家介绍手机90Hz或120Hz屏幕刷新率有啥区别,看完你就懂了! 1、屏幕刷新率…

电脑技巧:如何更改Win10桌面文件路径,轻松给系统盘瘦身

大家平常为了方便经常会在桌面上保存各种各样的文件,有些桌面文件可能会比较大从而占用C盘的磁盘空间,而系统盘我们在分配的时候,一般只有60-100G左右,时间长了我们的系统盘就会出现磁盘容量不足的情况,其实我们可以将…

MAC下快速打开指定目录

1.通过快捷键搜索 command 空格,输入关键词 2.通过控制台打开 1) 跳转到指定路径 cd /usr 2) 当前路径下打开文件夹 open .

Spring系列(十一):@Profile 注解用法介绍

目录 一、Profile 注解的作用 二、Profile 指定环境的方式 2.1 JVM启动参数 2.2 通过代码方式控制: 三、Profile 实现切换数据源示例 3.1 导入依赖 3.2 新建数据源配置文件dataSource.properties 3.3 新建TestProfileConfig.java 配置类 3.4 新建测试类TestProfile.…

传递参数的2种情况的理解。

最近差不多一个月没写博客了,主要的原因是目前在使用 Markdown 写学到的一些心得,一方面方便记笔记,另一方面页面排版更加的美观。 个人笔记站点 : https://yewenxiang23.github.io 碰到的问题: 今天碰到一个关于传递参数的问题&a…