BeanPostProcessor(Spring后置处理器)如何使用呢?

2023-11-11

转自:

BeanPostProcessor(Spring后置处理器)如何使用呢?

BeanPostProcessor接口

  我们通常称其为后置处理器,通过重写接口中的方法可实现初始化前后的操作

BeanPostProcessor 接口源码

public interface BeanPostProcessor {
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}


postProcessBeforeInitialization:当Bean实例化、依赖注入后、初始化前调用
postProcessAfterInitialization :当Bean实例化、依赖注入、初始化都完成后调用

注意事项: 当我们需添加多个后置处理器实现类时,
   默认情况下 Spring 容器会根据后置处理器的定义顺序来依次调用,
   当然我们可实现Ordered接口中的getOrder方法设置后置处理器的执行属性,
     也可以通过实现 Ordered 接口的 getOrder 方法指定后置处理器的执行顺序 
       该方法返回值为整数,默认值为 0,值越大优先级越低。


   例 下面使用 Eclipse IDE 演示 BeanPostProcessor 接口的用法,
   步骤 : 创建 SpringDemo 项目,
              并在 src 目录下创建com.java265包 添加相应的 jar 包,可参阅第一个Spring程序
          在com.java265包下创建
      HelloWorld、InitHelloWorld、InitHelloWorld2 和 MainApp 类。
                  在 src 目录下创建 Spring 配置文件 Beans.xml。
      运行SpringDemo项目 HelloWorld 类代码

package com.java265;
public class HelloWorld {
    private String message;
    public void setMessage(String message) {
        this.message = message;
    }
    public void getMessage() {
        System.out.println("Message : " + message);
    }
    public void init() {
        System.out.println("Bean正在初始化");
    }
    public void destroy() {
        System.out.println("Bean将要被销毁");
    }
}

InitHelloWorld 类代码

package com.java265;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;
public class InitHelloWorld implements BeanPostProcessor, Ordered {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("A Before : " + beanName);
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("A After : " + beanName);
        return bean;
    }
    @Override
    public int getOrder() {
        return 8;
    }
}

注意事项: postProcessBeforeInitialization 和 postProcessAfterInitialization 方法返回值不能为 null,
               否则会报空指针异常或者通过 getBean() 方法 获取不到 Bean 实例对象,
     因为后置处理器从Spring IoC 容器中取出 Bean 实例对象后没有再次放回到 IoC 容器中
InitHelloWorld2 类代码

package com.java265;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;
public class InitHelloWorld2 implements BeanPostProcessor, Ordered {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("B Before : " + beanName);
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("B After : " + beanName);
        return bean;
    }
    @Override
    public int getOrder() {
        return 0;
    }
}

Beans.xml

<!--?xml version="1.0" encoding="UTF-8"?-->
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean class="com.java265.HelloWorld" destroy-method="destroy" id="helloWorld" init-method="init">
        <property name="message" value="Hello World!">
    </property></bean>
    <!-- 注册处理器 -->
    <bean class="com.java265.InitHelloWorld"></bean>
    <bean class="com.java265.InitHelloWorld2"></bean>
 </beans>

MainApp 类

package com.java265;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
        obj.getMessage();
        context.registerShutdownHook();
    }
}

-----运行输出结果-----
B Before : helloWorld
A Before : helloWorld
Bean正在初始化
B After : helloWorld
A After : helloWorld
Message : Hello World!
Bean将要被销毁

从以上的运行代码中,我们可以得到
   postProcessBeforeInitialization 方法是在 Bean 实例化和依赖注入后,自定义初始化方法前执行的
   postProcessAfterInitialization 方法是在自定义初始化方法后执行的
    由于 getOrder 方法返回值越大,优先级越低,所以 InitHelloWorld2 先执行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BeanPostProcessor(Spring后置处理器)如何使用呢? 的相关文章

随机推荐

  • Linux下Socket编程

    什么是Socket Socket接口是TCP IP网络的API Socket接口定义了许多函数或例程 程式员能够用他们来研发TCP IP网络上的应用程式 要学Internet上的TCP IP网络编程 必须理解Socket接口 Socket接
  • 七. Kubernetes Objects对象,对象状态与yaml

    目录 一 基础概念理解 二 k8s 对象中的spec与status 三 如何编写yaml 一 基础概念理解 Kubernetes Objects 官方地址 在k8s中所有操作资源实体都可以称为对象 先下图中的这些 都可以称为对象 不同对象功
  • 汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)

    不同类型内中断的区分 中断类型码 8086cpu中在下面4种情况下会产生内中断 1 除法错误 如之前提到的除法溢出 2 单步执行 3 执行into指令 4 执行int指令 那么当内中断发生时cpu如何来区分到底是哪种中断源呢 通过中断类型码
  • 代码随想录训练营day9

    题目一 实现strStr 力扣题目链接 题目描述 给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标 下标从 0 开始 如果 needle 不是 haysta
  • GLSL的in、out存储限制符使用错误

    在GLSL中用in修饰的变量表示传入的数据 用out修饰的变量表示传出的数据 通过这样可以实现顶点着色器向片段着色器传递数据 但要注意这个变量的命名要相同 不相同的话 片段着色器是获取不到从顶点着色器传入的数据的 1 顶点着色器 versi
  • unity打包技巧

    打包准备 1 android 需要jdk 和android sdk 如果有使用C 的库 还需要NDK 只有将 so文件放在 Assets Plugins Android libs下 Unity才会将 so文件识别为共享库 并在打包时将之拷贝
  • 分布式事务-seata AT模式-强一致性。

    目录 1 seata原理 2 关键组件 3 seate服务端参数 4 微服务配置 5 业务流程 6 依次启动eureka seate服务器 微服务 1 seata原理 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的
  • element-ui 表格一行显示多行内容并实现多行内某一行列合并

    这是加上边框的 去掉边框后这个表格看着更明显一点 表格一行放多行内容 并让第二行进行列合并 第一行不合并
  • 详解数据结构之顺序栈的基本操作(C语言描述)

    1 栈是线性表的特例 因此栈的顺序存储其实也就是线性表顺序存储的简化 我们称之为顺序栈 线性表是采用数组来实现的 因此顺序栈也采用数组来实现 2 栈的结构定义 elementype类型根据实际情况而定 这里假设为int类型 栈的结构体定义为
  • 时间序列ARIMA滚动预测

    什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列 时间序列分析就是通过观察历史数据预测未来的值 在这里需要强调一点的是 时间序列分析并不是关于时间的回归 它主要是研究自身的变化规律的 这里不考虑含外生变量的时间序列 为什么用py
  • C语言结构体struct的比较

    两个struct结构体进行比较 首先不能直接比较 struct A a b a和b相比是错误的 其次不能进行内存比较 如下 程序运行的结果会如何 void DiffStructWithMultiVar struct A a 0 struct
  • 远程连接身份验证错误,找不到加密Oracle修正(正解)

    出现问题 使用远程连接弹出一个对话框 提示 发生身份验证错误 要求的函数不受支持 方法一 win r 输入gpedit msc 找到下面路径 策略路径 计算机配置 gt 管理模板 gt 系统 gt 凭据分配 设置名称 加密 Oracle 修
  • 图像质量评估

    图像质量评估 http jingyan baidu com article cbf0e500f5505a2eab28936e html 客观评价方法 图像质量的客观评价方法是根据人眼的主观视觉系统建立数学模型 并通过具体的公式计算图像的质量
  • Java基础——集合

    首先呢 给大家讲一下集合的由来 java的思想是面向对象思想 如果想统一的管理所有的对象 就涉及到用容器来储存对象 而对象数组是可以存储对象的 但是数组有一个缺点就是长度固定 为了突破这一限制 集合就应运而生了 数组和集合的优缺点 长度 数
  • 代码随想录刷题--(链表篇)19. 删除链表的倒数第 N 个结点 ---快慢指针法

    题目链接 https leetcode cn com problems remove nth node from end of list 代码随想录链接 https programmercarl com 0019 删除链表的倒数第N个节点
  • 前端实现换肤功能

    项目背景 由于项目要求 需要前端对不同的企业用户展示不一样的颜色 也就是简单的更改肤色 本来使用前端框架会很容易解决 但是公司目前的架构不是很好 前后端分离也没有那么彻底 web工程还是搭配jsp 没办法 只好用最纯粹的css来实现换肤要求
  • 一个月拿下十几份测试岗offer的简历是什么样子的?

    一 简历模板 在应聘之前 不能不聊一聊简历 简历是职场的敲门砖 是获得offer的通行证 那样对一个初级测试工程师来说 应该如何写简历呢 可能对萌新来说 完完全全不知道怎么下手 在这里大家从0开始写 第一步你需要去找一份简历模板 可以是网络
  • 实时系统RTX之理解一

    文献来源 http wzhyblog yo2 cn articles e5 ae 9e e6 97 b6 e7 b3 bb e7 bb 9frtx e5 ae 98 e6 96 b9 e6 96 87 e6 a1 a3 e4 b8 ad e
  • Windows环境下使用UHD PythonAPI开发USRP X310

    目录 UHD介绍 安装UHD 烧写X310固件 安装uhd python API 测量功率实例 UHD介绍 UHD是USRP开源软件无线电硬件架构的底层软件包 包含上位机和USRP设备中的FPGA的bit文件两个部分 提供了上位机控制FPG
  • BeanPostProcessor(Spring后置处理器)如何使用呢?

    转自 BeanPostProcessor Spring后置处理器 如何使用呢 BeanPostProcessor接口 我们通常称其为后置处理器 通过重写接口中的方法可实现初始化前后的操作 BeanPostProcessor 接口源码 pub