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.mzph.cn/news/33812.shtml

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

相关文章

[内网渗透]CFS三层靶机渗透

文章目录 [内网渗透]CFS三层靶机渗透网络拓扑图靶机搭建Target10x01.nmap主机探活0x02.端口扫描0x03.ThinkPHP5 RCE漏洞拿shell0x04.上传msf后门(reverse_tcp)反向连接拿主机权限 内网渗透Target2&#xff08;1&#xff09;路由信息探测&#xff08;2&#xff09;msf代理配置&a…

LeetCode150道面试经典题--找出字符串中第一个匹配项的下标(简单)

1.题目 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 2.示例 3.思路 回溯算法&#xff1a;首先将…

LeetCode[1122]数组的相对排序

难度&#xff1a;Easy 题目&#xff1a; 给你两个数组&#xff0c;arr1 和 arr2&#xff0c;arr2 中的元素各不相同&#xff0c;arr2 中的每个元素都出现在 arr1 中。 对 arr1 中的元素进行排序&#xff0c;使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现…

【mysql】MySQL CUP过高如何排查?

文章目录 一. 问题锁定二. QPS激增会导致CPU飘高三. 慢SQL会导致CPU飘高四. 大量空闲连接会导致CPU飘高五. MySQL问题排查常用命令 一. 问题锁定 通过top命令查看服务器CPU资源使用情况&#xff0c;明确CPU占用率较高的是否是mysqld进程&#xff0c;如果是则可以明确CUP飘高的原…

[ubuntu]创建root权限的用户 该用户登录后自动切换为root用户

一、创建新用户 1、创建新用户 sudo useradd -r -m -s /bin/bash 用户名 # -r&#xff1a;建立系统账号 -m&#xff1a;自动建立用户的登入目录 -s&#xff1a;指定用户登入后所使用的shell2、手动为用户设置密码 passwd 用户名 二、为用户增加root权限 1、添加写权限 ch…

【redis基础】

目录 一、概述 1.NoSQL 1.1 简述 1.2 类型 1.3 应用场景 1.3.1 缓存 1.3.2 分布式锁 1.3.3 计数器 1.3.4 会话管理 1.3.5 消息队列 2.Redis 2.1 简述 2.2 特性 2.3 监听端口号 2.4 数据类型 二、安装 1.编译安装 2.RPM安装 三、目录结构 1.查看 2.主配置文…

[保研/考研机试] KY163 素数判定 哈尔滨工业大学复试上机题 C++实现

题目链接&#xff1a; 素数判定https://www.nowcoder.com/share/jump/437195121691718831561 描述 给定一个数n&#xff0c;要求判断其是否为素数&#xff08;0,1&#xff0c;负数都是非素数&#xff09;。 输入描述&#xff1a; 测试数据有多组&#xff0c;每组输入一个数…

[Docker实现测试部署CI/CD----构建成功后钉钉告警(7)]

目录 15、钉钉告警创建项目群&#xff0c;然后添加机器人添加机器人Jenkins 系统配置项目配置修改Jenkinsfile文件&#xff0c;添加钉钉提示信息测试 不修改Jenkinsfile文件&#xff0c;添加钉钉提示信息测试 15、钉钉告警 创建项目群&#xff0c;然后添加机器人 首先需要在钉…

搭建 Python 环境 | Python、PyCharm

计算机 计算机能完成的工作&#xff1a; 算术运算逻辑判断数据存储网络通信…更多的更复杂的任务 以下这些都可以称为 “计算机”&#xff1a; 一台计算机主要由以下这几个重要的组件构成 CPU 中央处理器&#xff1a;大脑&#xff0c;算术运算&#xff0c;逻辑判断 存储器&…

CSS 的选择器有哪些种类?分别如何使用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 元素选择器&#xff08;Element Selector&#xff09;⭐ 类选择器&#xff08;Class Selector&#xff09;⭐ ID 选择器&#xff08;ID Selector&#xff09;⭐ 后代选择器&#xff08;Descendant Selector&#xff09;⭐ 子元素选择器&a…

物联网的定义、原理、示例、未来

什么是物联网? 物联网 (IoT) 是指由嵌入传感器、软件和网络连接的物理设备、车辆、电器和其他物理对象组成的网络&#xff0c;允许它们收集和共享数据。这些设备(也称为“智能对象”)的范围可以从简单的“智能家居”设备(如智能恒温器)到可穿戴设备(如智能手表和支持RFID的服…

k8sday02

第四章 实战入门 本章节将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其进行访问。 Namespace ​ Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 ​ 默认情况下&…

springBoot的日志文件

日志是程序的重要组成部分&#xff0c;主要可以用来定位和排查问题。除此之外&#xff0c;还可以用来&#xff1a; 1. 记录用户的登录日志&#xff0c;方便分析用户是正常登录还是恶意破解&#xff1b; 2. 记录系统的操作日志&#xff0c;方便数据恢复和定位操作人&#xff1b;…

【C语言】小游戏-三字棋

大家好&#xff0c;我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑随机下棋 6.判断输赢 7.判断棋盘是否满了 四、完整代码 game.h(相关函数的声明&#xff0c;整个代码要引用的头文件以及宏…

某大厂笔试(小*的车站的最近距离)

有一个环形的公路&#xff0c;上面共有n站&#xff0c;现在给定了顺时针第i站到第i1站之间的距离&#xff08;特殊的&#xff0c;也给出了第n站到第1站的距离&#xff09;&#xff0c;小*想着沿着公路第x站走到第y站&#xff0c;她想知道最短的距离是多少&#xff1f; 输入描述…

小程序商城开发制作

当开发一个商城小程序时&#xff0c;费用是一个非常重要的考虑因素。然而&#xff0c;准确回答这个问题是有一定困难的&#xff0c;因为开发商城小程序的费用取决于多个因素。以下是一些可能影响价格的主要因素&#xff1a; 1. 功能需求&#xff1a;商城小程序的复杂程度和功能…

阻塞队列的安全实现,定时器的安全实现(面试易考),超详细

一、&#x1f49b; 如何实现一个线程安全的阻塞队列 目前&#xff0c;当前代码是循环队列&#xff08;还没有进行改动&#xff09; head和tail的判空判断满两种方法: 1.浪费一个格子&#xff0c;当前走到head的前一个位置&#xff0c;就认为队列满的 2.单独搞一个变量&#xff…

系统架构设计专业技能 · 网络规划与设计(三)【系统架构设计师】

系列文章目录 系统架构设计专业技能 网络规划与设计&#xff08;三&#xff09;【系统架构设计师】 系统架构设计专业技能 系统安全分析与设计&#xff08;四&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构设计&#xff08;一&#xff09;【系统架构设计师…

手把手带你跑通网站上线全流程(一个简单的HTML和Python服务端完整上线流程)

我将向你介绍如何将一个网站部署到公网&#xff0c;包含完整流程。 前端静态网站 静态网站文件 首先需要准备一个简单的网页文件用于展示页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

2023深圳杯A题完整代码模型

已更新深圳杯A题全部版本&#xff0c;文末获取&#xff01; 摘要 现代社会&#xff0c;随着生活方式的变化和工作压力的增大&#xff0c;慢性非传染性疾病日益成为威胁公众健康的主要问题。心脑血管疾病、糖尿病、恶性肿瘤及慢性阻塞性肺病等慢性病的发病率呈现出上升趋势。为…