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.hqwc.cn/news/63894.html

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

相关文章

【OpenCV常用函数:轮廓检测+外接矩形检测】cv2.findContours()+cv2.boundingRect()

文章目录 1、cv2.findContours()2、cv2.boundingRect() 1、cv2.findContours() 对具有黑色背景的二值图像寻找白色区域的轮廓&#xff0c;因此一般都会先经过cvtColor()灰度化和threshold()二值化后的图像作为输入。 cv2.findContous(image, mode, method[, contours[, hiera…

关于@JSONField的使用

1.此注解来自jar包com.alibaba.fastjson 今天分享一个有意思的事情。这个注解作用与类的属性上&#xff0c;如下&#xff1a; ApiModelProperty(value"开始时间,格式:yyyy-MM-dd",required true) JSONField(name"start_date",ordinal 1) private String…

第二十三章 原理篇:Pix2Seq

大夏天我好像二阳了真是要命啊。 现在找到工作了&#xff0c;感觉很快乐&#xff0c;但是也有了压力。 《论你靠吹牛混进公司后该怎么熬过试用期》 希望自己能保持学习的习惯&#xff01;加油&#xff01; 参考教程&#xff1a; https://arxiv.org/pdf/2109.10852.pdf https://…

探索极限:利用整数或字符串操作找出翻转后的最大数字

本篇博客会讲解力扣“1323. 6 和 9 组成的最大数字”的解题思路&#xff0c;这是题目链接。 对于这道题目&#xff0c;我会讲解2种解题思路&#xff0c;分别是直接操作整数&#xff0c;和利用字符串操作。希望大家通过本题学习关于整数和字符串的技巧。 显然&#xff0c;这道题…

SpringBoot案例-部门管理-根据id查询

目录 根据页面原型&#xff0c;明确需求 查看接口文档 思路分析 接口功能实现 控制层&#xff08;Controller类&#xff09; 业务层&#xff08;Service类&#xff09; 业务类 业务实现类 持久层&#xff08;Mapper类&#xff09; 接口测试 前后端联调 根据页面原型&…

垃圾回收算法

JVM垃圾回收算法 JVM&#xff08;Java Virtual Machine&#xff09;使用垃圾回收算法来管理内存&#xff0c;自动释放不再使用的对象&#xff0c;以避免内存泄漏和内存溢出。 标记-清除 标记清除是最简单和干脆的一种垃圾回收算法&#xff0c;他的执行流程是&#xff1a;当 …

数据结构:力扣OJ题

目录 ​编辑题一&#xff1a;链表分割 思路一&#xff1a; 题二&#xff1a;相交链表 思路一&#xff1a; 题三&#xff1a;环形链表 思路一&#xff1a; 题四&#xff1a;链表的回文结构 思路一&#xff1a; 链表反转&#xff1a; 查找中间节点&#xff1a; 本人实力…

智能优化算法:白鲨优化算法-附代码

智能优化算法&#xff1a;白鲨优化算法 文章目录 智能优化算法&#xff1a;白鲨优化算法1.白鲨优化算法1.1 初始化1.2 速度更新1.3位置更新1.4鱼群行为 2.实验结果3.参考文献4.Matlab5.python 摘要&#xff1a;WSO 算法是 Braik 等于 2022 年提出一种基于白鲨深海觅食策略的新型…

【二分+贪心】CF1665 C

Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始想太简单wa6了 只想到先感染大的分量&#xff0c;然后最后把最大的分量剩下的染色 但是可能会有别的分量更大&#xff08;因为最后给最大的染色之后可能不再是最大的&#xff09; 可以用堆维护&#xf…

前端笔试题1

HTML/CSS 题1&#xff1a; 1&#xff0e;使用CSS 让该节点不可见&#xff0c;方法越多越好。 <div class"hidden">Hi</div> 使用CSS 让节点不可见的方法有以下几种&#xff1a; 把 visibility 属性设置为 hidden&#xff0c;这样元素框不会被绘制&…

PHP 之房贷计算器、组合贷

一、等额本金 // &#xff08;等额本金&#xff09; //$loanAmount>贷款金额 //$loanPeriod>贷款年限 //$interestRate>贷款利息 function calculateEqualPrincipalPayment($loanAmount, $loanPeriod, $interestRate) {$monthlyPrincipal $loanAmount / ($loanPerio…

分享一个计算器

先看效果&#xff1a; 再看代码&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>计算器</title><style>* {box-sizing: border-box;}body…