spring监听器的使用(spring的分布式监听器,会出现不同机器进行处理吗)

本文目录
- spring的分布式监听器,会出现不同机器进行处理吗
- Spring里的监听有
是什么作用 小弟初学,通俗的讲吧 - Spring Session中session的事件监听
- requestcontextlistener 和contextloaderlistener 可以在web.xml中同时配置么
- Spring事件监听机制源码解析
- SpringMVC中为什么要配置Listener和Servlet
- SpringBoot 发布ApplicationEventPublisher和监听ApplicationEvent事件
- 简单实现SpringBoot中对Apollo配置的动态监听
spring的分布式监听器,会出现不同机器进行处理吗
会。监听器用于监听某一个动作,然后做出相应的反应,主要用于排错定位。据相关资料查询显示,spring的分布式监听器,每一个监听器只对应多个个机器,会出现不同机器进行处理的情况。监听器机制的优点是,当一个事件发布后,会有不同的监听器来处理。
Spring里的监听有 是什么作用 小弟初学,通俗的讲吧
listener标签是用于监听的,ContextLoaderListener实现了ServletContextListener接口,可以监听所有的servlet,好想还有关于监听session的,request的等等的接口,具体名称忘了。这样对于每个用户请求,都被contextLoaderlistener监听到,执行请求都要先经过这个类,这个类肯定是做些转移的操作,把由servlet容器管理的类转到spring容器去管理,首先肯定是产生spring容器,spring容器起作用了
Spring Session中session的事件监听
Redis版本》2.8
(默认spring session会自动开启该配置)
配置文件:notify-keyspace-events Ex
命令行:redis-cli config set notify-keyspace-events Egx
不需要自动开启该配置的话可以将如下配置加入到容器中
在spring-Session中session的创建、删除、过期都会接收到redis相关事件的通知
spring-session中接收到相关通知后再由Spring发布相关ApplicationEvent(SessionCreatedEvent 、SessionDeletedEvent 、SessionExpiredEvent)
由spring-context提供的@EventListener注解即可实现相关事件的监听
Spring Session官方文档
将Redis消息转换为Spring的ApplicationEvent实现类:org.springframework.session.data.redis.RedisOperationsSessionRepository
Redis键空间通知
Spring-session启动失败
Spring-session redis启动失败
requestcontextlistener 和contextloaderlistener 可以在web.xml中同时配置么
在SSH2、SSM等web应用开发框架的配置过程中,因为都要用到spring,所以,往往我们首先都要配置Spring。Spring配置过程中要考虑两个监听器:ContextLoaderListener与RequestContextListener。这两个监听器是什么意思?是不是两个监听器都需要配置?它们之间到底存在什么关系?下面,根据实验和网上的资料解释,我将汇总如下:
ContextLoaderListener与RequestContextListener
ContextLoaderListener
ContextLoaderListener extends ContextLoader implements ServletContextListener。
ServletContextListener extends EventListener。
ServletContextListener只负责监听Web容器的启动和关闭的事件。
ContextLoaderListener(或ContextLoaderServlet)将Web容器与spring容器进行整合。
这是使用Spring 必须配置 的:
《listener》
《listener-class》org.springframework.web.context.ContextLoaderListener《/listener-class》
《/listener》
1
2
3
1
2
3
Spring配置文件的声明:
《context-param》
《param-name》contextConfigLocation《/param-name》
《param-value》classpath:applicationContext.xml《/param-value》
《/context-param》
1
2
3
4
1
2
3
4
如果没有显式声明,则 系统默认 在WEB-INF/applicationContext.xml。
在一个团队使用Spring的实际项目中,应该需要多个Spring的配置文件,如何使用和交叉引用的问题:
如果想装入多个配置文件,可以用逗号作分隔符,如:
Spring事件监听机制源码解析
1.Spring事件监听体系包括三个组件:事件、事件监听器,事件广播器。
事件:定义事件类型和事件源,需要继承ApplicationEvent。
事件监听器:用来监听某一类的事件,并且执行具体业务逻辑,需要实现ApplicationListener 接口或者需要用@ListenerEvent(T)注解。好比观察者模式中的观察者。
事件多播器:负责广播通知所有监听器,所有的事件监听器都注册在了事件多播器中。好比观察者模式中的被观察者。Spring容器默认生成的是同步事件多播器。可以自定义事件多播器,定义为异步方式。
创建 AnnotationConfigApplicationContext 的过程中,会执行refresh()中的initApplicationEventMulticaster()方法。该方法先获取bean工厂,然后判断工厂是否包含了beanName 为 applicationEventMulticaster的bean。如果包含了,则获取该bean,赋值给applicationEventMulticaster 属性。如果没有,则创建一个 SimpleApplicationEventMulticaster 对象,并且赋值给 applicationEventMulticaster 。实现了源码如下:
监听器的注册有两种,通过实现 ApplicationListener接口或者添加@EventListener注解。
注册的逻辑实现在refresh()中的registerListeners()方法里面。第一步,先获取当前ApplicationContext中已经添加的 applicationListeners(SpringMVC源码中有用到),遍历添加到多播器中。第二步,获取实现了ApplicationListener接口的listenerBeanNames集合,添加至多播器中。第三步,判断是否有早期事件,如果有则发起广播。
思考一下,上面的代码中第二步为啥添加的是listenerBeanName?
如果监听器是懒加载的话(即有@Lazy 注解)。那么在这个时候创建监听器显然是不对的,这个时候不能创建监听器。所以添加监听器到多播器的具体逻辑放在初始化具体的监听器之后。通过 BeanPostProcessor 的接口实现。具体的实现类是 ApplicationListenerDetector 。这个类是在 refreah()中prepareBeanFactory()方法中添加的。代码如下:
在创建 AnnotationConfigApplicationContext 的构造方法中,会执行org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object) 方法。这个方法中会添加两个 beanDefs, 代码如下:
EventListenerMethodProcessor:事件监听器的BeanFactory后置处理器,在前期会创建 DefaultEventListenerFactory ,后期在创建好Bean之后,根据 EventListener 属性,调用DefaultEventListenerFactory创建具体的 ApplicationListenerMethodAdapter 。
DefaultEventListenerFactory:监听器的创建工厂,用来创建 ApplicationListenerMethodAdapter 。
EventListenerMethodProcessor 的类继承图如下:
在refreash的invokeBeanFactoryPostProcessors()中会调用 org.springframework.context.event.EventListenerMethodProcessor#postProcessBeanFactory方法,获取EventListenerFactory 类型的 Bean。代码如下:
在 org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons 方法中,创建完所有的单例Bean 之后,会遍历所有Bean是否实现了 SmartInitializingSingleton 接口。如果实现接口会执行该 Bean 的 afterSingletonsInstantiated() 方法。代码如下:
org.springframework.context.event.EventListenerMethodProcessor#afterSingletonsInstantiated 中会调用私有方法 processBean()进行 ApplicationEventAdatper 的创建。代码如下:
可以通过调用 org.springframework.context.support.AbstractApplicationContext#publishEvent(java.lang.Object, org.springframework.core.ResolvableType) 方法进行事件的调用。代码如下:
SimpleApplicationEventMulticaster 中的 multicasEvent,invokeListener,doInvokeListener 三个方法代码如下:
SpringMVC中就是通过Spring的事件机制进行九大组件的初始化。
监听器定义在FrameworkServlet类中,作为内部类。代码如下:
监听器的添加在org.springframework.web.servlet.FrameworkServlet#configureAndRefreshWebApplicationContext 中进行。通过SourceFilteringListener进行包装。添加代码如下:
在refresh中的registerListeners方法进行添加,代码如下:
在refresh中的finishRefresh()方法中,会调用publishEvnet(new ContextRefreshedEvent(this))发布事件。进行多播器广播,代码如下
最终会调到FrameworkServlet.this.onApplicationEvent(event)。
SpringMVC中为什么要配置Listener和Servlet
1.监听器启动和servlet启动都会initWebApplicationContext,由各自的初始化方法来触发。
2.两者各自的上下文最终都会保存到servletContext中,root WebApplicationContext使用固定的attrName,dispatcherServlet使用FrameworkServlet.class.getName() + “.CONTEXT.”+servletName。
3.最佳实践还是监听器加servlet的配置,各司其职,父上下文做核心容器,子上下文处理web相关。如果你要把springMVC换成其他框架如struts,也不会有什么影响。
4.监听器可以在整个webapp启动时初始化IOC容器,并在关闭时做一些处理。
SpringBoot 发布ApplicationEventPublisher和监听ApplicationEvent事件
SpringBoot 异步事件实现异步(ApplicationEventPublisher、ApplicationEvent)
当把一个事件发布到Spring提供的ApplicationContext中,被监听器侦测到,就会执行对应的处理方法。
实现方法
自定义需要发布的事件类,需要继承ApplicationEvent类或PayloadApplicationEvent《T》(该类也仅仅是对ApplicationEvent的一层封装)
使用@EventListener来监听事件
使用ApplicationEventPublisher来发布自定义事件(@Autowired注入即可)
可以使核心业务与子业务进行解耦,也方便后期的业务的扩展。如新用户注册之后,需要发放优惠券,此时可以在保存用户之后,发布一个新用户的 注册成功事件 ,通过监听该事件来实现发放优惠券的功能。后期新增一个对新用户进行xxx功能,此时可以新写一个监听 注册成功事件 的监听器,来处理新的业务逻辑,而不需要修改之前的注册逻辑。
***隐藏网址***
1、创建事件,继承ApplicationEvent
2、发布订单取消事件(定时任务查询未付款的超时订单,进行关闭)
3、监听事件
4 、BaseApplicationContextUtil 工具类
***隐藏网址***
简单实现SpringBoot中对Apollo配置的动态监听
1.实现CommandLineRunner接口,自定义一个任务类,交由spring容器管理对象;
2.在任务类中使用@ApolloConfig注解注入一个Config对象,默认注入的是命名空间为application的配置对象(可配置其他的命名空间);
3.使用注入的config对象中的addChangeListener()方法添加一个事件监听器,可以在监听器中实现具体的逻辑;
4.当Apollo被监听的配置更新时,就会执行监听器中的逻辑(完成).

本文相关文章:
springsowing课文翻译(springsowing早中晚干了什么)
2026年7月1日 14:50
spring cloud全家桶(spring全家桶学习顺序)
2026年6月29日 10:20
更多文章:
跷二郎腿太低好吗?想要通过贴墙站改正二郎腿影响的话,有哪些要点需要注意
2026年10月11日 05:10
易语言点击js按钮(易语言网页填表怎样点击链接为“javascript:void(0)“的按钮)
2026年10月11日 03:00
compare with造句(用compared with和compared to造句)
2026年10月10日 23:30
tensorflow与keras对应版本(为什么tensorflow2.8没有keras)
2026年10月10日 22:10
maven仓库jar网站(如何在maven仓库中添加jar包)
2026年10月10日 19:50




