Spring拓展知识:后置处理器与事件监听器

spring事件监听器系列三:通过ApplicationListener接口方式实现监听器源码 前面有介绍了@EventListener注解方式的源码,这篇笔记主要来记录通过实现ApplicationListener接口这种方式实现事件监听器的原理 具体的流程,前面博客中,有插入一个截图,我们这篇博客中,主要介绍解析的细节,具体的流程,就不在这里叙述,在上一篇博客中有记录整个流程 解析ApplicationListener实现类源码 org.springframework.context.support.ApplicationListenerDetector#postProcessAfterIniti 阅读详情

Spring 拓展

使ssm的的时候。首先就会找到spring ,为什么?

应为我们需要将对象交给srping来统一管理,

我们先来复习一下,spring的两大特性

ioc

我们同过spring来帮助我们创建类,帮助我们类之间的解耦

aop

可以在不改变类的源码情况下,添加一些增强的方法,可以是前置,后置 ,异常等等

我们想要用框架,实现越来越多的功能的时候,往往要填加很多很多的bean组件,在使用的时候就可以直接去使用ioc容器中的类,

后置处理器

创建类也有区分不同

  • 有工厂创建的单例
  • 有bean的创建

这些都需要有对应的后置处理器,接下来我们就来看看spring给我们提供了那些灵活的处理器,只要是注入到容器中的bean在即将初始化的时候,都会执行后置处理器,完成之后才放入spring的池子中。

bean的处理器

BeanPostProcessor : bean的后置处理器作用是在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。注意是Bean实例化完毕后及依赖注入完成后触发的。接口的源码如下

源码中有两个方法:

postProcessBeforeInitialization:实例化,依赖注入完毕,再调用显示初始化之前完成游戏额定制初始化的任务

postProcessAfterInitialization:实例化,依赖注入,初始化后执行

这里我们写个小demo来体验一下

新建一个类,叫myBeanPostProcessor,我们实现这个后置处理器的接口

参数解释 :

参数1 bean :就是我们注入到ioc的对象

参数2 beanName : 就是我们注入到ioc的对象名字

public class MyBeanPostProcessor implements BeanPostProcessor {
  public Object postProcessBeforeInitialization(Object bean, String beanName)
      throws BeansException {
    System.out.println(beanName+"初始化执行前");
    return bean;
  }

  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    System.out.println(beanName+"初始化执行后");
    return bean;
  }
}

简单实例,实行之后,可以看我们注入对象的初始化前和初始化后的输出信息

Bean工厂后置处理器

这个bean工厂处理器,是在所有bean的创造之前对bean的一些修改,我们可以在没有构造对象之前,对bean做什么,

postProcessBeanFactory方法 : 参数有bean工厂的对象,可以查看到一些信息

image-20211010172012953

他就是返回一个在bena创建之前的创建工厂对象,我们可以查看工厂中要创建的bean信息

BeanDefinitionRegistryPostProcessor(后置bean组件信息处理器)

为了处理我们在放容器到spring的时候的一些配置,比如是否单例,初始化方法,销毁方法,等等信息的后置处理器

image-20211010172341715

方法

postProcessBeanDefinitionRegistrybean对象的配置信息注册

postProcessBeanFactory之后进到bean的工厂

public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry)
      throws BeansException {
    System.out.println("postProcessBeanDefinitionRegistry:" + beanDefinitionRegistry);
  }

  public void postProcessBeanFactory(
      ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    System.out.println("ConfigurableListableBeanFactory:" + configurableListableBeanFactory);
  }

Bean组件的各个生命周期

  • bean组件信息处理器:组件信息注册
  • bean工厂创建,我们自己写的后置工厂处理器是一样的,
  • bean创建和注入完成
  • 初始化前
  • 初始化完成
  • 初始后
  • 销毁

小demo,使用Bean工厂操作bean的注入

全新配置文件 : beanFactoryProcessor.xml,就放两个没有任何配置的bean对象

    <bean id="mypostProcessBeanFactory" class="com.hyc.Processor.MypostProcessBeanFactory"/>
    <bean id="demobean" class="com.hyc.springBean.demoBean"></bean>

用beanFactory操作bean对象,实现配置,和属性注入

public class MypostProcessBeanFactory implements BeanFactoryPostProcessor {
  public void postProcessBeanFactory(
      ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    System.out.println("configurableListableBeanFactory" + configurableListableBeanFactory);
    // 获取对象
    AbstractBeanDefinition demobean =
        (AbstractBeanDefinition) configurableListableBeanFactory.getBeanDefinition("demobean");
    // 设置初始化方法
    demobean.setInitMethodName("init1");
    // 注入name值
    MutablePropertyValues propertyValues = demobean.getPropertyValues();
    propertyValues.add("name", "PostProcessorFactory bane name");
    // 设置销毁方法
    demobean.setDestroyMethodName("destroy1");
  }
}

之后输出查看信息

image-20211010174808177

接下来我们复制一个自定义bean工厂

image-20211010175106616

配置文件新增一个bean

    <bean id="mypostProcessBeanFactory2" class="com.hyc.Processor.MypostProcessBeanFactory2"/>

给两个工厂实现优先级接口,设置优先级,

一号工厂优先级为5

二号工厂优先级为10

public class MypostProcessBeanFactory2 implements BeanFactoryPostProcessor, Ordered {
 //之前工厂的代码省略

  public int getOrder() {
    return 10;
  }

启动测试

image-20211010175631070

可以看到有级别为5的是线执行的

完美,以上就是用后置处理器来操作bean属性的是实战了

spring事件监听器

可以监听我们spring中发生的时间,我们也可以自定义一个spring的事件监听器

我们学习这个主要是要知道spring在容器中执行的时候都派发了什么事件

这里我们实现ApplicationListener<ApplicationEvent>

这里泛型里的对象是全局的消息,我们也可以写一个自己的自定义的

public class MyApplicationEvent extends ApplicationEvent {
  public MyApplicationEvent(Object source) {
    super(source);
  }

  String username;
  String emial;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getEmial() {
    return emial;
  }

  public void setEmial(String emial) {
    this.emial = emial;
  }

  public MyApplicationEvent(Object source, String username, String emial) {
    super(source);
    this.username = username;
    this.emial = emial;
  }
}

之后创建新的配置文件 Listener.xml将事件监听器加入到spring容器中

  <bean id="listener" class="com.hyc.listener.myApplicationListener"></bean>

修改事件监听器,让我们来看看是在生成bean的时候都派发了什么事件吧

public class myApplicationListener implements ApplicationListener<ApplicationEvent> {
  public void onApplicationEvent(ApplicationEvent event) {
    System.out.println("接受到的事件" + event);
      //这里怕判断是如果有我们自己的定义内容将事件监听器强转成我们的自定监听器,保证自己的自定义事件也可以输出
    if (event instanceof MyApplicationEvent) {
      MyApplicationEvent myApplicationEvent = (MyApplicationEvent) event;
      System.out.println("用户名" + myApplicationEvent.getUsername());
      System.out.println("用户邮箱" + myApplicationEvent.getEmial());
    }
  }
}

之后测试

public class listenerMain {
  public static void main(String[] args) {
    ClassPathXmlApplicationContext ApplicationContext =
        new ClassPathXmlApplicationContext("Listener.xml");
    //创建事件对象
    MyApplicationEvent event = new MyApplicationEvent("事件内容", "james", "123@qq,com");
    //发送事件
    ApplicationContext.publishEvent(event);
    ApplicationContext.close();
    //
  }
}

image-20211010182140609

可以看到图中spring的加载过程越来越明显清晰了起来

Spring高频面试基础问题与知识点整理 高频Spring相关基本面试题和知识点整理 阅读详情

相关推荐

摄像头模组CCM简介

摄像头模组,全称Camera Compact Module,简写为CCM。CCM 包含几大件: 镜头(lens)、音圈马达(VCM)、传感器(sensor)、软板(FPC)、图像处理芯片(DSP)。工作原理:物体通过镜头(lens)聚集的光,通过CMOS或CCD集成电路,把光信号转换成电信号,再经过内部图像处理器(ISP)转换成数字图像信号输出到数字信号处理器(DSP)加工处理,转换成标准的GRB、YUV等格式图像信号。摄像头模组主要由以下几个部分组成:镜头(Lens):将光线汇聚到图像传感器上。

m0_73482095的博客 1万+

Spring源码学习-Aop原理,事件机制

通过操作代理类,先把所有的增强器再转变为真正的方法拦截器增强器只是保存了切面执行方法的一些信息,转为拦截器才能真正执行目标的方法接下来是责任链的设计模式,在方法执行的前后执行对应的通知方法(构造成为了一个拦截器链list)把构造好的链还有很多其他信息传进去,构造一个类,并调用它的proceed方法,在此步骤拦截器生效了其内包含一个。

一个有信仰的技术人 748

【SpringBoot】-- 监听容器事件、Bean的前后置事件

ApplicationContextInitializer、ApplicationListener、BeanFactoryPostProcessor、InitializingBean/DisposableBean、BeanPostProcessor接口使用。

个人博客 1500

AD56XXR系列DAC驱动设计:SPI接口、寄存器配置与嵌入式工程实践

数模转换器(DAC)是嵌入式系统实现高精度模拟控制的核心器件,其性能取决于通信协议可靠性、寄存器配置准确性及硬件协同设计能力。基于SPI总线的电压输出型DAC广泛应用于工业控制、光模块偏置、传感器校准等场景,需兼顾静态精度、动态响应与低功耗特性。AD56XXR系列作为典型集成内部基准与多通道同步更新能力的12/14/16位DAC,支持轨到轨输出与灵活掉电模式,为资源受限MCU提供可移植固件范式。本文围绕SPI时序约束、16位指令字解析、LDAC同步机制及精度补偿策略展开,覆盖从硬件连接、初始化流程到量产级可

weixin_33481022的博客 610

RV1126B SDK移植实战:从DDR配置到USB烧写全解析

本文详细解析了RV1126B SDK移植的核心实战流程,重点攻克了DDR初始化失败与USB烧写两大难题。文章从理解启动流程入手,提供了DDR配置错误的排查步骤、SDK编译配置要点,并深入讲解了USB烧写的完整操作与常见问题解决方案,旨在帮助开发者高效完成系统移植与稳定运行。

weixin_29164497的博客 542

Spring框架——AOP前置、后置、环绕、异常通知

通知类型: 步骤: 1.定义接口 2.编写对象(被代理对象=目标对象) 3.编写通知(前置通知目标方法调用前调用) 4.在beans.xml文件配置 4.1配置 被代理对象=目标对象 4.2配置通知 4.3配置代理对象 是 ProxyFactoryBean的对象实例 4.3.1代理接口集--> 4.3.2织

Lizhifun 1万+

Halcon 20.11在WPF中的交互式绘图:完整实现矩形ROI的创建、拖动与坐标获取

本文详细介绍了如何在WPF框架下利用Halcon 20.11实现交互式矩形ROI的创建、拖动与坐标获取。通过HDrawingObject和HSmartWindowControlWPF控件,开发者可以高效构建机器视觉应用,提升项目实战中的开发效率。文章涵盖环境配置、事件处理、坐标获取及性能优化等关键内容。

weixin_29266007的博客 427

Spring中BeanPostProcessor(后置处理器)与事件监听器的一些实现及原理

/** 扩展原理: BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的 1、BeanFactoryPostProcessor:beanFactory的后置处理器; 在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容; 所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建 ...

qq_45409009的博客 683

从零到一:R与RStudio的安装与配置全攻略

本文提供了R与RStudio的完整安装与配置指南,涵盖Windows、Mac和Linux三大操作系统。从基础环境搭建到高级性能优化,详细介绍了R语言安装、RStudio配置、项目管理和实用技巧,帮助数据科学初学者快速搭建高效的分析工作环境。

weixin_29062671的博客 420

Codex 100个真实案例 - 用AI绘制CAD机械图纸(工程师看了直呼内行)

本案例将展示如何用 Codex 生成 Python 脚本,通过 `ezdxf` 库绘制标准 DXF 格式的 CAD 机械图纸。我们会从零开始,逐步实现直线、圆、圆弧、标注等基本图形元素,最终绘制出一张包含主视图、俯视图、尺寸标注、标题栏和技术要求的完整法兰盘零件图。还会演示参数化批量生成不同规格零件图和自动 BOM 物料清单,生成的 DXF 文件可直接在 AutoCAD、FreeCAD 中打开。全程用自然语言驱动 Codex,工程师看完直接上手!

yueyeguzhuo的专栏 2072

spring源码--09--IOC高级特性--BeanPostProcessor后置处理器的实现

spring源码–09–IOC高级特性–BeanPostProcessor后置处理器的实现 1、BeanPostProcessor 后置处理器是一个监听器,可以监听容器触发的Bean声明周期事件。 后置处理器向容器注册以后,容器中管理的Bean就具备了接收IoC容器事件回调的能力。 BeanPostProcessor的使用非常简单,只需要提供一个实现接口BeanPostProcessor的实现类,然后在Bean的配置文件中设置即可。 2、源码 public interface B

zhou920786312的博客 614

[QMT量化交易小白入门]-三十七、QMT中如何使用类似于通达信中的VBA函数(量化python代码解析)

这段代码主要围绕着在QMT环境中实现类似通达信VBA函数的功能展开,核心功能是基于RSI指标来判断股票的买卖时机,并根据持仓情况进行相应的交易操作。class G():passg = G()这里定义了一个空类G,并创建了该类的实例g。这个实例g将作为全局变量来存储一些在整个程序运行过程中需要共享的数据,例如除复权类型、股票代码、目标数量等。1、使用VBA开发策略时,参数固化的问题会带来一些限制,比如无法修改MA函数的周期参数,只能使用固定周期。

木头大左的博客 1698

spring后置处理器对bean的处理逻辑

ApplicationListenerDetector:事件监听器的后置处理器

编码爱好者 408

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

spring事件监听器系列二:@EventListener注解原理

前面的笔记中,有写过,我们要在spring中声明一个事件监听器,有两种方式,一种是实现ApplicationListener接口,一种是通过@EventListener注解来修饰一个方法,并在该注解中,指定要监听的事件,那这个方法在事件发生的时候,会被回调 这两种机制,其实我们先不看代码,去考虑下,实现的方式很有可能就是: 对于实现接口这种方式,是ApplicationListenerDetector这个类来完成解析的 对于注解这种方式,是EventListenerMethodProcessor和Defau

小小少年的博客 4661

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Spring Boot】SpringBoot设计了哪些可拓展的机制?

当我们引入注册中心的依赖,比如nacos的时候,当我们启动springboot,这个服务就会根据配置文件自动注册到注册中心中,这个动作是如何完成的?注册中心使用了SpringBoot中的事件监听机制,在springboot初始化的时候完成服务注册。

DreamSun的博客 1288

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

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

Spring Bean的五大核心后置处理器赏析:Bean生命周期的幕后操控者

本文深入剖析了Spring容器中五大核心Bean后置处理器的工作原理。重点解析了AutowiredAnnotationBeanPostProcessor如何实现依赖注入,CommonAnnotationBeanPostProcessor如何处理生命周期回调,以及AnnotationAwareAspectJAutoProxyCreator创建AOP代理的机制。此外还介绍了ApplicationListenerDetector和PersistenceExceptionTranslationPostProcess

张小洛的BOLG 1163

Spring IOC容器核心机制:Bean后置处理器注册全解析

本文深入解析Spring框架中registerBeanPostProcessors阶段的核心作用与实现机制。作为IOC容器启动的关键步骤,该阶段通过三级优先级系统注册Bean后置处理器,支撑了依赖注入、AOP代理和生命周期回调等核心功能。

张小洛的BOLG 819

Spring的哪些后置处理器

9、ApplicationListenerDetector 主要处理Event事件发布和监听的后置处理器,在监听者实例化的时候,会把所有的监听者加到集合中,在发布消息的时候,会遍历监听者集合,判断是否是指定事件的监听者。10、LoadTimeWeaverAwareProcessor 处理AspectJ的,这个AspectJ和我们平时切面里面的AspectJ不是一个东西,这种是通过类加载期织入。4、AutowiredAnnotationBeanPostProcessor(自动装配后置处理器)

weixin_37862824的博客 436

Spring源码分析一:容器篇—refresh()

文章目录(一)BeanFactory与ApplicationContext容器(二)ApplicationContext层次结构 (一)BeanFactory与ApplicationContext容器 BeanFactory是加载Bean的基础基石,早期spring的实现是利用XmlBeanFactory来实现其基本功能,相对于ApplicationContext来说,缺少了很多扩展性。 BeanFactory beanFactory = new XmlBeanFactory(new ClassPath

小萌新的博客 1186

Spring之refresh的12个步骤

根据B站黑马视频总结 1. refresh的12个步骤 prepareRefresh obtainFreshBeanFactory prepareBeanFactory postProcessBeanFactory invokeBeanFactoryPostProcessors registerBeanPostProcessors initMessageSource initApplicationEventMulticaster onRefresh registerListe...

weixin_44390164的博客 5211

Springboot启动流程分析(三):刷新IOC容器之执行beanFactory后置处理器原理

不惮其烦,逐行解析,全景再现Springboot启动流程。

bigbearxyz的博客 1025

spring4

synchronized (this.startupShutdownMonitor) { // 准备工作,例如记录事件,设置标志,检查环境变量等,并有留给子类扩展的位置,用来将属性加入到applicationContext中 prepareRefresh(); // 创建beanFactory,这个对象作为applicationContext的成员变量,可以被applicationContext拿来用, // 并且解析资源(例如xml文件),取得bean的定义,放在beanFactory中 Configur

m0_63175850的博客 328

Spring源码(五)Spring 事件监听器的两种注册方式

了解专栏完整的内容,请点击跳转: Spring Framework专栏导航页 作为一款优先的框架,怎么能少得了监听器呢?虽然说现基于web开发的项目很少用到监听器(大多使用消息队列),但是有些时候又需要用到。以及我们想监听Spring容器的初始化相关事件时候,就可以用到Spring自带的的监听器实现方式。 重要组件:事件多播器 监听器思维导图 两种监听器实现方式 接口方式 @Lazy @Component public class ContextRefreshedInterfaceListener i

weixin_39997751的博客 952

SpringIOC注解启动原理,后置处理器BeanPostProcessor,Spring-Aop原理,Spring-Transaction原理(个人笔记)

1.容器启动配置类/配置文件中,标记了@EnableAspectJAutoProxy开启aop功能的注解2.根据 @EnableAspectJAutoProxy 的@Import(AspectJAutoProxyRegistrar.class)向容器中注入一个AnnotationAwareAspectJAutoProxyCreator 组件3.AnnotationAwareAspectJAutoProxyCreator 组件: (1)实现了 SmartInstantiationAwareBeanPostPr

脑壳疼 764

【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析

简单分析 Spring 事件监听器 @EventListener 注解初始化流程以及事件发布流程。

MichelleChung的星球 2922
上一篇: 亚马逊云科技 Build On 参与心得
下一篇: JUC系列(一) 多线程基础复习
冷环渊
博客等级 码龄7年 1130粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值