Mr. Cappuccino的第61杯咖啡——Spring之BeanPostProcessor

Spring之BeanPostProcessor

    • 概述
    • 基本使用
      • 项目结构
      • 项目代码
      • 运行结果
      • 源代码
    • 常用处理器
      • 项目结构
      • 项目代码
      • 执行结果

概述

BeanPostProcessor:Bean对象的后置处理器,负责对已创建好的bean对象进行加工处理;

BeanPostProcessor中的两个核心方法:
postProcessBeforeInitialization:在每个bean对象的初始化方法执行之前执行该方法,如InitializingBean的afterPropertiesSet方法;
postProcessAfterInitialization:在每个bean对象的初始化方法执行之后执行该方法,如InitializingBean的afterPropertiesSet方法;

基本使用

项目结构

在这里插入图片描述

项目代码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com</groupId><artifactId>spring-bean-post-processor</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.1.RELEASE</version></dependency></dependencies></project>

AutowireBean.java

package com.spring.bean;import org.springframework.stereotype.Component;/*** @author honey* @date 2023-08-11 16:50:19*/
@Component
public class AutowireBean {public void autowire(){System.out.println("AutowireBean 执行autowire()");}}

UserBean.java

package com.spring.bean;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** @author honey* @date 2023-08-11 16:48:33*/
@Component
public class UserBean {private AutowireBean autowireBean;public UserBean() {System.out.println("UserBean 执行构造方法");}@Autowiredpublic void setAutowireBean(AutowireBean autowireBean) {System.out.println("UserBean 依赖注入:" + autowireBean);this.autowireBean = autowireBean;}@PostConstructpublic void init() {System.out.println("UserBean 执行init()");}@PreDestroypublic void destroy() {System.out.println("UserBean 执行destroy()");}public void autowire() {System.out.println("UserBean 执行autowire()");autowireBean.autowire();}
}

MyBeanPostProcessor.java

package com.spring.processor;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;/*** @author honey* @date 2023-08-11 16:42:27*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {private final String beanName = "userBean";/*** 在每个bean对象的初始化方法执行之前执行** @param bean     bean对象* @param beanName bean名称* @return 在调用init初始化之前,可以修改原有bean对象,如果返回为null,则直接返回原有bean对象* @throws BeansException BeansException*/@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (this.beanName.equals(beanName)) {System.out.println("UserBean 执行postProcessBeforeInitialization方法");System.out.println("UserBean 实例对象:" + bean);}return bean;}/*** 在每个bean对象的初始化方法执行之后执行** @param bean     bean对象* @param beanName bean名称* @return 在调用init初始化之后,可以修改原有bean对象,如果返回为null,则直接返回原有bean对象* @throws BeansException BeansException*/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (this.beanName.equals(beanName)) {System.out.println("UserBean 执行postProcessAfterInitialization方法");System.out.println("UserBean 实例对象:" + bean);}return bean;}
}

SpringConfig.java

package com.spring.config;import org.springframework.context.annotation.ComponentScan;/*** @author honey* @date 2023-08-11 16:51:26*/
@ComponentScan(value = {"com.spring.bean,com.spring.processor"})
public class SpringConfig {}

SpringTest01.java

package com.spring.test;import com.spring.bean.UserBean;
import com.spring.config.SpringConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @author honey* @date 2023-08-11 16:53:30*/
public class SpringTest01 {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);UserBean userBean = applicationContext.getBean("userBean", UserBean.class);System.out.println("--------------------------");System.out.println("UserBean 实例对象:" + userBean);userBean.autowire();System.out.println("--------------------------");applicationContext.close();}
}

运行结果

在这里插入图片描述

从运行结果可以看到,postProcessBeforeInitialization方法在init()方法执行之前执行,而postProcessAfterInitialization方法在init()方法执行之后执行。


在postProcessBeforeInitialization和postProcessAfterInitialization方法中可以对原有的bean对象进行修改,如果方法的返回值为null,则不会对原有的bean对象进行修改。

第一种情况:返回值为原有bean对象

在这里插入图片描述

第二种情况:返回值为null

在这里插入图片描述

运行结果:

在这里插入图片描述


第三种情况:返回值不是原有的bean对象

在这里插入图片描述

运行结果:

在这里插入图片描述


源代码


AbstractAutowireCapableBeanFactory.java

在这里插入图片描述

在这里插入图片描述


常用处理器

AutowiredAnnotationBeanPostProcessor:处理@Autowired注解
CommonAnnotationBeanPostProcessor:处理@Resource注解

项目结构

在这里插入图片描述

项目代码

OrderBean.java

package com.spring.bean;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;/*** @author honey* @date 2023-08-12 19:16:27*/
@Component
public class OrderBean {private AutowireBean autowireBean;public OrderBean() {System.out.println("OrderBean 执行构造方法");}@Autowiredpublic void setAutowireBean1(AutowireBean autowireBean) {System.out.println("OrderBean @Autowired依赖注入:" + autowireBean);this.autowireBean = autowireBean;}@Resourcepublic void setAutowireBean2(AutowireBean autowireBean) {System.out.println("OrderBean @Resource依赖注入:" + autowireBean);this.autowireBean = autowireBean;}@PostConstructpublic void init() {System.out.println("OrderBean 执行init()");}@PreDestroypublic void destroy() {System.out.println("OrderBean 执行destroy()");}public void autowire() {System.out.println("OrderBean 执行autowire()");autowireBean.autowire();}}

SpringTest02.java

package com.spring.test;import com.spring.bean.AutowireBean;
import com.spring.bean.OrderBean;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.support.GenericApplicationContext;/*** @author honey* @date 2023-08-12 19:20:53*/
public class SpringTest02 {public static void main(String[] args) {GenericApplicationContext applicationContext = new GenericApplicationContext();// 注册bean对象applicationContext.registerBean("orderBean", OrderBean.class);applicationContext.registerBean("autowireBean", AutowireBean.class);// 处理@Autowired注解applicationContext.registerBean(AutowiredAnnotationBeanPostProcessor.class);// 处理@Resource注解applicationContext.registerBean(CommonAnnotationBeanPostProcessor.class);applicationContext.refresh();OrderBean orderBean = applicationContext.getBean("orderBean", OrderBean.class);System.out.println("--------------------------");System.out.println("AsyncBean 实例对象:" + orderBean);orderBean.autowire();System.out.println("--------------------------");applicationContext.close();}
}

执行结果

在这里插入图片描述

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

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

相关文章

【快应用】如何避免通知栏提示快应用一直获取地理位置

【关键词】 地理位置、subscribe、unsubscribe 【问题背景】 快应用中调用geolocation.subscribe接口获取地理位置&#xff0c;即使在定位完成后&#xff0c;会在通知栏一直显示某某快应用在获取地理位置&#xff0c;为了避免用户认为一直在获取他的位置&#xff0c;导致用户…

详解web前端长度单位(px、em、rem、%、vw/vh、vmin/vmax、vm、calc())

1&#xff09;简介 在前端开发中&#xff0c;会遇到各种不同类型的长度单位&#xff0c;比如px,em,rem等。 而整体的长度单位分为两大类&#xff1a; 绝对长度单位包括&#xff1a;in,cm, mm, q, pt, pc, px 相对长度单位包括&#xff1a;em, rem, %, vw, vh, vmax, vmin, vm,…

react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作

目录 react 09之状态管理工具1 redux react-thunk的使用实现跨组件状态管理与异步操作store / index.js store的入口文件index.js 在项目入口文件 引入store / actionType.js 定义action的唯一标识store / reducers / index.jsstore / actions / form.jsstore / reducers / for…

政务、商务数据资源有效共享:让数据上“链”,记录每一个存储过程!

数据上链是目前“区块链”最常见的场景。因为链上所有参与方都分享了统一的事实来源&#xff0c;所有人都可以即时获得最新的信息&#xff0c;数据可用不可见。因此&#xff0c;不同参与方之间的协作效率得以大幅提高。同时&#xff0c;因为区块链上的数据难以篡改&#xff0c;…

【CI/CD】Rancher K8s

Rancher & K8s Rancher 和 K8s 的关系是什么&#xff1f;K8s 全称为 Kubernetes&#xff0c;它是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用。而 Rancher 是一个完全开源的企业级多集群 Kubernetes 管理平台&#xff0c;实现了 Kubernetes 集群在混合…

zabbix自动注册服务器以及部署代理服务器

文章目录 Zabbix自动注册服务器及部署代理服务器一.zabbix自动注册1.什么是自动注册2.环境准备3.zabbix客户端配置4.在 Web 页面配置自动注册5.验证自动注册 二.部署 zabbix 代理服务器1.分布式监控的作用&#xff1a;2.环境部署3.代理服务器配置4.客户端配置5.web页面配置5.1 …

基于OpenCV的人脸识别和模型训练系统(万字详解)

前言 我们身边的人脸识别有车站检票&#xff0c;监控人脸&#xff0c;无人超市&#xff0c;支付宝人脸支付&#xff0c;上班打卡&#xff0c;人脸解锁手机。 人脸检测是人脸识别系统组成的关键部分之一&#xff0c;其目的是检测出任意给定图片中的包含的一个或多个人脸&#…

基于扩频的数字视频水印嵌入和检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................. for j 1:length(attens…

生成国密密钥对

在线生成国密密钥对 生成的密钥对要妥善保管&#xff0c;丢失是无法找回的。

JVM——类的生命周期

文章目录 类加载过程加载验证准备解析初始化 卸载 一个类的完整生命周期如下&#xff1a; 类加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用&#xff0c;那么虚拟机是如何加载这些 Class 文件呢&#xff1f; 系统加载 Class 类型的文件主要三步:加载->连接->…

Spring中Bean的生命周期以及Bean的单例与多例模式

一. Bean的生命周期 bean的生命周期可以表达为&#xff1a;bean的定义➡bean的初始化➡bean的使用➡bean的销毁 Bean的初始化过程 1&#xff09;通过XML、Java annotation&#xff08;注解&#xff09;以及Java Configuration&#xff08;配置类&#xff09; 等方式加载Bea…

同步jenkinsfile流水线(sync-job)

环境 变量&#xff1a;env&#xff08;环境变量&#xff1a;sit/dev/simulation/prod/all&#xff09;&#xff0c;job&#xff08;job-name/all&#xff09;目录&#xff1a;/var/lib/jenkins/jenkinsfile environment.json&#xff1a; [roottest-01 jenkinsfile]# cat env…

elementUI时间选择器el-time-picker的坑

//开始时间<el-time-pickerplaceholder"选择时间":format"HH:mm:ss" //显示的时间样式value-format"HH:mm:ss" //绑定值的样式 //不给默认为 Date 对象值&#xff1a;"2023-07-31T16:00:00.000Z"v-model"FormData.startTime&…

JavaWeb-Servlet服务连接器(终)

上一篇文章JavaWeb-Servlet服务连接器&#xff08;三&#xff09;_Alphamilk的博客-CSDN博客 目录 1.ServletContext通信 会话技术Cookie与Session 1.Cookie 2.Session 1.ServletContext通信 概念&#xff1a;代表了整个web应用&#xff0c;用于与服务器实现通信 可以通…

docker-php扩展

生成扩展骨架 环境&#xff1a;docker-compose、php74 1.本地要有一份 php-src git clone https://github.com/php/php-src.git cd php-src git checkout PHP-7.4.52.\www\php-src\ext可以看到有一个 ext_skel.php 文件 3.通过ext_skel.php脚本创建了一个hello扩展&#xf…

同步请求和异步请求

同步请求和异步请求是在网络编程中常用的两种通信模式&#xff0c;它们有以下区别&#xff1a; 同步请求&#xff1a; 在发送一个请求后&#xff0c;程序会一直等待服务器返回响应&#xff0c;期间无法进行其他操作。请求发出后&#xff0c;程序会阻塞在请求处&#xff0c;直…

变压器故障诊断(python代码,逻辑回归/SVM/KNN三种方法同时使用,有详细中文注释)

视频效果&#xff1a;变压器三种方法下故障诊断Python代码_哔哩哔哩_bilibili代码运行要求&#xff1a;tensorflow版本>2.4.0,Python>3.6.0即可&#xff0c;无需修改数据路径。 1.数据集介绍&#xff1a; 采集数据的设备照片 变压器在电力系统中扮演着非常重要的角色。…

【Spring源码】小白速通解析Spring源码,从0到1,持续更新!

Spring源码 参考资料 https://www.bilibili.com/video/BV1Tz4y1a7FM https://www.bilibili.com/video/BV1iz4y1b75q bean工厂 DefaultListableBeanFactory&#xff08;最原始&#xff09; bean的生命周期 创建&#xff08;实例化&#xff09;–>依赖注入–>-初始化…

【数据结构】循环队列

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Java课题笔记~ 整合第三方技术

1. 整合JUnit 问题导入 回忆一下Spring整合JUnit的步骤&#xff1f; 1.1 Spring整合JUnit&#xff08;复习&#xff09; 1.2 SpringBoot整合JUnit 【第一步】添加整合junit起步依赖(可以直接勾选) <dependency><groupId>org.springframework.boot</groupId…