Spring学习 之容器扩展点:后置处理器BeanPostProcessor

电阻基础知识及应用电路仿真(Multisim) 本文围绕硬件工程师必备的电阻知识,从基础知识、实操、应用仿真三方面做系统讲解:基础上明确电阻的核心参数、分类、串并联计算及核心特性;实操中详解贴片/色环电阻的阻值读取、贴片封装换算,重点区分0Ω电阻(贴装跳线,实现功能选通/调试等)与磁珠(高频吸噪)的差异及选型;应用上介绍限流、分压、上拉/下拉、阻抗匹配、过压/过流保护五大典型电路的设计公式、选型原则和实操要点,同时给出电阻通用的选型、测量和布线设计规范,形成完整的电阻应用知识体系。 阅读详情

文章目录

综述

先回顾Bean生命周期的这张图,看看BeanPostProcessor调用位置。
在这里插入图片描述
通过上图看到BeanPostProcessor(Bean后置处理器)两个方法在bean生命周期的位置,即:在Spring容器完成Bean实例化和属性设置后,并且在bean调用初始化方法之前或之后。因此BeanPostProcessor(Bean后置处理器)常用在:对bean内部的值进行修改;实现Bean的动态代理等。

可以定义一个或者多个BeanPostProcessor接口的实现,然后注册到容器中。那么该容器里管控的所有Bean在调用初始化方法之前或之后,都会调用BeanPostProcessor接口中对应的方法。

InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口。从最上面的生命周期图,我们知道它在Bean生命周期的另外三个时期提供扩展的回调接口。其使用方法与BeanPostProcessor接口类似,只时回调时机不同。

BeanPostProcessor接口有两个方法:

  • Object postProcessBeforeInitialization(Object bean,String BeanName)throws BeansException;
  • Object postProcessAfterInitialization(Object bean,String BeanName)throws BeansException;

容器调用接口定义的方法时会将该受管Bean的实例和名字通过参数传入方法,经过处理后通过方法的返回值返回给容器。注意,不能返回null,如果返回的是null那么我们通过getBean方法将得不到目标。

BeanPostProcessor不允许标记为延迟加载。因为如果这样做,Spring容器将不会注册它们,自定义逻辑也就无法得到应用。假如你在元素的定义中使用了’default-lazy-init’属性,那就必须将每个BeanPostProcessor显示标记为’lazy-init=“false”’。

如果定义了多个BeanPostProcessor,可以在xml配置中通过order属性来指定执行的顺序。

简单例子

类代码:

public class FootballPlayer implements PlayerActionInterface {
    String name;//球员名字
    String team;//所在球队
    @Override
    public void shoot() {
        System.out.println(this.getName()+"射门");
    }

    @Override
    public void pass() {
        System.out.println(this.getName()+"边路传中");
    }
}

注册:

<bean id="footballPlayer" class="com.mvc.FootballPlayer">
	<property name="name" value="C.罗纳尔多"></property>
</bean>

自定义BeanPostProcessor后置处理器,修改球员名称:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class BeanPostProcessorImpl implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        /**
         * 后处理器beanPostProcessor会对容器中所有的bean起作用,因此我们要限定一下范围。
         * 这个例子中,我们只处理PlayerActionInterface对象
         */
        if(bean instanceof PlayerActionInterface){
            ((FootballPlayer) bean).setName("James");
        }
        return bean;
    }
}

将后置处理器加入到Spring容器中:

<bean id="beanPostProcessor" class="com.mvc.BeanPostProcessorImpl"/>

代理使用例子:
在刚才的例子基础上,有新的需求:教练团队需要在每一次调用pass(),shoot()方法时,记录调用时间,用来进行战术分析。
重写BeanPostProcessor后处理器(BeanPostProcessorImpl.java)
代码如下:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class BeanPostProcessorImpl implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        /**
         * 后处理器beanPostProcessor会对容器中所有的bean起作用,因此我们要限定一下范围。
         * 这个例子中,我们只处理PlayerActionInterface对象
         */
        if(bean instanceof PlayerActionInterface){
            ((FootballPlayer) bean).setName("James");
        }

        final Object finalBean = bean;
        Map map = new ConcurrentHashMap(100);
        if(map.get(beanName)!=null){
            return map.get(beanName);
        }
        Class[] classes=bean.getClass().getInterfaces();
        if(classes.length<1){
            //没有接口的,无法进行代理
            return bean;
        }
        Object proxyObj = Proxy.newProxyInstance(this.getClass().getClassLoader(),
                classes,
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method,
                                         Object[] args) throws Throwable {
                        System.out.println("method:" + method.getName());
                        Object result = method.invoke(finalBean, args);
                        System.out.println("发生时间:"
                                + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))
                                .format(new Date()));
                        return result;
                    }
                });
        map.put(beanName, proxyObj);

        return proxyObj;
    }
}

业务调用代码要将以前的类声明改成接口声明PlayerActionInterface,因此调整为:

@Test
public void test() throws Exception{
    ApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContext.xml");
    PlayerActionInterface bean = ctx.getBean("footballPlayer", PlayerActionInterface.class);
    bean.pass();
}

运行结果:
在这里插入图片描述

补充:
当然也可以用BeanPostProcessor实现AOP代理。

rk3568 点亮双LVDS 屏 承接文章《rk3568点亮LCD(lvds)》中仅仅只能使用亮单LVDS;经过厂商的努力,陆续发布新补丁。目前支持双lvds显示,缺憾是需要自己额外移植相关补丁。受限于通信频率和VOP编码能力,支持最大分辨仍然是1920x1080、60fps。 阅读详情

相关推荐

JavaScript性能优化:全链路性能优化策略

JavaScript性能优化是提升Web应用质量的核心要素,直接影响用户体验与业务成果。研究表明,页面加载延迟1秒可能导致转化率下降7%。高效的JavaScript执行能减少主线程阻塞,避免动画卡顿或操作延迟,尤其在移动端低性能设备上更为关键。优化内存管理与减少冗余计算可降低浏览器资源消耗,防止因内存泄漏导致的崩溃,提升应用稳定性。在竞争激烈的互联网环境中,性能优势已成为产品差异化的关键因素,直接影响用户留存与商业价值。因此,性能优化应作为开发全周期的核心实践,而非事后补救措施。

weixin_49707375的博客 1270

Spring扩展点(一):后置处理器PostProcessor

之前我们对Spring,我们称之为配置类后置处理器。什么是后置处理器呢?其实后置处理器是**Spring提供给我们的一个非常重要的扩展点**,并且Spring内部的很多功能也是通过后置处理器来完成的,的重要性就说明这一点,同时该扩展点也方便Spring与其他框架进行集成,如Spring集成mybatis框架,就是通过后置处理器实现了扫描mapper接口注入到Spring容器中的。Spring框架中大致提供了以下三个核心后置处理器:BeanDefinitionRegistryPostProcessor。

weixin_41821642的博客 1020

Python入门基础教程(非常详细)

Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。Python类库(模块)极其丰富,这使得Python几乎无所不能,不管是传统的Web开发、PC软件开发、Linux运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python都能胜任。这套Python基础教程不是教科书,不会玩弄概念,而是力求口语化和通俗化,让读者尽快入门。如果有小朋友出于兴趣学习Python,请引导他阅读本教程的前半部分,这是基础,可以降低学习成本;...

Yuki1127918的博客 34万+

Spring的扩展点后置处理器,Spring bean的生命周期

这个是腾讯课堂鲁班学院讲解Spring源码老师做的笔记 后置处理器 Bean工厂的初始化过程 Bean的生命周期

苏雨丶 359

Stable Diffusion跑图总爆显存?别急着换显卡,试试这个PYTORCH_CUDA_ALLOC_CONF参数调优

本文深入解析了Stable Diffusion运行中常见的显存不足问题,特别是由显存碎片化导致的假性OOM现象。通过详细讲解PYTORCH_CUDA_ALLOC_CONF参数中的max_split_size_mb设置技巧,提供了一套完整的显存优化方案,帮助用户在无需升级硬件的情况下显著提升AI绘画的稳定性与效率。

weixin_42524100的博客 347

VHDL实战:基于EDA的数字频率计(FREQ)设计与优化

本文详细介绍了使用VHDL语言和EDA工具设计并优化数字频率计(FREQ)的全过程。从核心原理与模块划分入手,深入讲解了时钟分频、测频控制、计数锁存及显示驱动等关键模块的VHDL实现,并提供了从代码编写、功能仿真到综合布局布线的完整EDA实战指南。文章还探讨了测量精度优化、资源权衡及跨时钟域处理等进阶话题,是掌握FPGA数字系统设计的经典案例。

milk8的博客 583

Spring容器的后置处理器

BeanFactoryPostProcessor 容器后置处理器实现接口自定义容器后置处理器的实现类 MyBeanFactoryProcessor,实现BeanFactoryPostProcessor,重写postProcessorBeanFactory()方法 /***@authorliujian*@date2018/1/9*/publicclassMyBeanF...

weixin_33709219的博客 241

ansys命令流力磁耦合仿真

文章目录前言一、力磁耦合仿真流程二、静力学仿真三、力磁耦合模型构建四、静磁学仿真总结 前言 一、力磁耦合仿真流程 力磁耦合有限元仿真流程中,首先进行静力学仿真,经过前处理模块、分析计算模块和后处理模块提取三维模型单元应力,然后根据力磁耦合方程中,通过matlab将单元应力导入到磁导率与应力的关系式中,得到单元的相对磁导率。最后采用载荷传递耦合方式,进行静磁学模拟仿真,分析计算得到该载荷下试件的磁场分布。,如下图所示为力磁耦合仿真流程图: 二、静力学仿真 下图为中心预制条形缺陷的Q235钢板试..

wsfwsf128的博客 2661

Spring学习:IOC后置处理器BeanFactoryPosProcessor

BeanFactoryPosProcessor后置处理器,也称之为IOC容器后置处理器。他作用于IOC容器中的Bean创建之前(实例化之前),其主要用途为转换器的加载。他在IOC容器中的生命周期如下图所示: (一)BeanFactoryPosProcessor的实现类为IOC容器的后置处理器 IOC容器的后置处理器必须实现于接口BeanFactoryPosProcessor,实现类中需重写方法postProcessBeanFactory方法。IOC后置处理器常用于注册转换器,具体示例代码如下: // T

给时光以文明 338

python -- 海洋气象科研论文中常用绘图配色汇总

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。可以通过自定义选取不同颜色的rgb,通过自定义的方式构建colormap。

weixin_68789096的博客 972

别再死记硬背了!用Wireshark抓包实战,5分钟搞懂GRE、L2TP、IPsec的区别

本文通过Wireshark抓包实战,详细解析GRE、L2TP和IPsec三大隧道协议的核心差异与应用场景。从报文结构到配置示例,帮助网络工程师快速掌握这些协议的本质,提升VPN部署与故障排查能力。特别适合准备HCIP认证的工程师深化理解。

weixin_30352645的博客 439

Bean 的生命周期回调

我们可能会在 Bean 对象创建完成后, 执行某些操作或在销毁前做某些操作. 我们可以实现 InitializingBean 或 DisposableBean 接口 public class Test implements InitializingBean, DisposableBean { @Override publ...

weixin_34245749的博客 401

uniapp - 热更新提示:WGT安装包中manifest.json文件不存在 | unexpected EOF!报错详细解决,完美搞定WGT安装包中WWW目录下manifest.json不存在问题

uniapp,安卓android,苹果ios,热更新,热更新code:-1202报错,,WGT热更新报错,uniapp热更新wgt出现报错manifest.json文件不存,uniapp安卓苹果软件热更新时出现错误unexpected EOF!如何解决,怎么解决热更新wgt报错,app新版本下载安装报错WGT安装包中manifest.json文件不存在,WGT安装包中WWW目录下manifest.json不存在,uniapp热更新报错安装失败[-1201]:WGT/WGTU文件格式错误,uniapp-wgt

✅ 精选推荐文章 1万+

【Spring学习23】容器扩展点:后置处理器BeanPostProcessor

综述先回顾bean生命周期的这张图,看看BeanPostProcessor调用位置 通过上图看到BeanPostProcessor(Bean后置处理器)两个方法在bean生命周期的位置,即:在Spring容器完成Bean实例化和属性设置后,并且在bean调用初始化方法之前或之后。因此BeanPostProcessor(Bean后置处理器)常用在:对bean内部的值进行修改;实现Bean的动态代理等

程序老兵的博客 1480

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

聚焦Spring后置处理器分析对比

Spring Framework 中的后置处理器允许在容器实例化 Bean 或者在 Bean 的生命周期中进行操作。从源码上来看的话,其实其扩展机制下的后置处理器其实很多。我们重点放到我们常用的几个上BeanPostProcessor、BeanFactoryPostProcessor来聚焦分析一下。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring扩展点之BeanPostProcessor

学习Spring扩展点,每天进步一点点

果子爸聊技术 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spring组件初始化扩展点:BeanPostProcessor

在Spring框架中,是一个强大的扩展接口,允许开发者在Bean初始化的过程中插入自定义逻辑。它是Spring IoC容器生命周期管理的核心机制之一,广泛应用于属性注入AOP代理监控等场景。理解的工作机制,能够帮助开发者更灵活地定制Spring容器的行为。是Spring框架中扩展容器功能的利器,通过介入Bean的生命周期,开发者可以实现高度定制化的逻辑。无论是框架本身的底层实现(如AOP、事务管理),还是业务层的通用增强(如日志、审计),都离不开这一机制的灵活支持。

从基础到源码解析的学习记录 4310

Spring之BeanPostProcessor(后置处理器)介绍

  为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口 BeanPostProcessor   该接口我们也叫后置处理器,作用是在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。注意是Bean实例化触发的。接口的源码如下 public interface BeanPostProcessor { ...

波波烤鸭的博客 4万+

Spring的扩展点都有哪些

目录前言一、扩展原理1、原始扩展点1.1、BeanFactoryPostProcessor1.2、BeanPostProcessor1.3、ApplicationListener2、衍生的扩展点2.1、InstantiationAwareBeanPostProcessor2.2、SmartInstantiationAwareBeanPostProcessor3、内置的重要后置处理器3.1、ConfigurationClassPostProcessor3.2、CommonAnnotationBeanPostP

kaixinnijiutiaowu的博客 3938

Springboot扩展点之BeanPostProcessor

在程序中我们可以自定义注解并标到相应的类上,当个类注册到Spring容器中,并实例化完成后,希望触发自定义注解对应的一些其他操作的时候,就可以通过BeanPostProcessor来实现。

凡夫编程 6015

简单易懂的Spring扩展点详细解析,看不懂你来打我

以上就是本文对Spring扩展点的所有介绍,基本上已经涵盖了Spring里面比较重要的扩展点,当然还有其他的一些扩展点没有介绍到,但是由于篇幅关系,就不全部罗列了。总结性的文字就不多说了,因为本文的字已经够多的了,这里就放两张图,供大家细品吧。

weixin_43889578的博客 6813

Spring常用扩展点

一、BeanPostProcessor 如果你想在Spring容器完成实例化,配置和初始化bean之后实现一些自定义逻辑,则可以插入一个或多个自定义BeanPostProcessor实现。这些实现成为后置处理器。 BeanPostProcessor接口包含两个回调方法。 当实现此接口类通过容器注册为后处理器时,由Spring容器实例的Bean,Spring容器会在bean 的init方法执行前回调postProcessBeforeInitialization方法, 然后会在bean初始化之后回

Jak的博客 1万+

spring扩展点二:自定义beanPostProcessor原理解析

beanPostProcessor是我在学习spring源码中,目前看到扩展最多的一个接口,比如:aop、spring事务、初始化方法回调,都是对该接口的扩展和实现,除了spring本身的框架,比如dubbo的ReferenceAnnotationBeanPostProcessor,这个扩展类就是一个后置处理器,用来解析@Reference注解的 bean后置处理器呢,spring在初始化bean的流程中,已经定义好了先执行后置处理器的哪个方法,后执行哪个方法,所以,我们在扩展的时候,要熟知这些方法执行位置

小小少年的博客 2047

深入解析Spring IoC容器:从启动流程到BeanPostProcessor扩展点

在软件工程领域,控制反转(Inversion of Control,IoC)是一种颠覆传统编程范式的设计原则。Spring框架将这一原则具象化为IoC容器,成为其架构体系中最核心的组件。理解IoC容器的本质,是掌握Spring框架底层原理的关键切入点。在Spring框架中,BeanPostProcessor是一个极其强大的扩展点,它允许开发者在Bean实例化、依赖注入以及初始化前后插入自定义逻辑。通过实现这个接口,我们可以对Spring容器中的Bean进行深度定制,甚至改变其默认行为。

zuiyuelong的博客 1598

BeanPostProcessor后置处理器原理以及ApplicationListener原理

BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的 1、BeanFactoryPostProcessor:BeanFactory的后置处理器; 在BeanFactory标准初始化之后调用;所有的bean定义已经保存加载到BeanFactory,但是bean的实例还没创建; BeanFactoryPostProcesso...

最怕一生碌碌无为,还安慰自己平凡可贵 5万+

【Spring】扩展点(三):BeanPostProcessor、InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor

前言:【Spring】扩展点(一):InitialingBean、DisposableBean、BeanPostProcessor、InstantiationAwareBeanPostProcessor 1.FactoryBean 传统的 Spring 容器加载一个 bean 的整个过程,都是由 Spring 控制的,换句话说,开发者除了设置Bean相关属性之外,是没有太多的自主权的。FactoryBean 改变了这一点,开发者可以个性化地定制自己想要实例化出来的 Bean,方法就是实现 Factory.

A minor 4113
上一篇: Spring学习 之容器扩展点:FactoryBean
下一篇: Maven 之项目构建过程详解
yyangqqian
博客等级 码龄15年 406粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值