【sping揭秘】9、容器内部事件发布(二)
写在前面----------------------------------
命运多舛,痴迷淡然
不知下一步该往哪里走,现在应该是我的迷茫期。。。
加油,快点走出去!!!
聪明的网友们,你们有没有迷茫的时候,你们又是怎么度过的呢?
通过上面的笔记我们可以了解到spring的事件的监听,但是这个都是spring中定义好的,那么我们如何自定义事件,监听,以及发布呢?、
那么事件的创建,我们是实现spring的事件接口
Spring的事件对象
package cn.cutter.start.event; import org.springframework.context.ApplicationEvent; import cn.cutter.start.event.constant.MethodExecutionStatusEnum; /**
*
* Title: MethodExecutionEvent.java
* Description: 定义一个自定义的spring事件对象
* @author xiaof
* @date 2018年3月28日
* @version 1.0
*
*/
public class MethodExecutionEvent extends ApplicationEvent { /**
*
*/
private static final long serialVersionUID = 2211772210416245698L; private String methodName;
private MethodExecutionStatusEnum methodExecutionStatusEnum; /**
* 构造函数是,继承的类实现的
* @param source
*/
public MethodExecutionEvent(Object source) {
super(source);
} public MethodExecutionEvent(Object source, String methodName, MethodExecutionStatusEnum methodExecutionStatusEnum) {
super(source);
this.methodName = methodName;
this.methodExecutionStatusEnum = methodExecutionStatusEnum;
} public String getMethodName() {
return methodName;
} public void setMethodName(String methodName) {
this.methodName = methodName;
} public MethodExecutionStatusEnum getMethodExecutionStatusEnum() {
return methodExecutionStatusEnum;
} public void setMethodExecutionStatusEnum(MethodExecutionStatusEnum methodExecutionStatusEnum) {
this.methodExecutionStatusEnum = methodExecutionStatusEnum;
} }
事件的监听
package cn.cutter.start.event; import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component; import cn.cutter.start.event.constant.MethodExecutionStatusEnum; /**
*
* Title: MethodExecutionEventListener.java
* Description: spring事件监听类型
* @author xiaof
* @date 2018年4月1日
* @version 1.0
*
*/
@Component //一定要添加进入spring的容器,才能进行监听
public class MethodExecutionEventListener implements ApplicationListener { @Override
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof MethodExecutionEvent) { MethodExecutionEvent methodExecutionEvent = (MethodExecutionEvent) event; //执行处理逻辑
System.out.println("执行自定义事件的相应操作"); if(methodExecutionEvent.getMethodExecutionStatusEnum().equals(MethodExecutionStatusEnum.BEGIN)) {
//方法开始方式
System.out.println("begin 开始执行前置事件----" + methodExecutionEvent.getMethodName());
} else {
System.out.println("end 开始执行后置事件----" + methodExecutionEvent.getMethodName());
} }
} }
事件的发布对象
package cn.cutter.start.event; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component; import cn.cutter.start.event.constant.MethodExecutionStatusEnum; /**
*
* Title: MethodExeuctionEventPublisher.java
* Description: 这里实现ApplicationEventPublisherAware,方便对applicationEventPublisher的注入
* @author xiaof
* @date 2018年4月1日
* @version 1.0
*
*/
@Component
public class MethodExeuctionEventPublisher implements ApplicationEventPublisherAware { private ApplicationEventPublisher applicationEventPublisher; @Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
} public void methodToMonitor() {
//这个方法就是对事件的发布操作
//发起开始事件并发布,发起后置事件并结束
MethodExecutionEvent beginEvnt = new MethodExecutionEvent(this, "cn.cutter.start.event methodToMonitor方法触发事件", MethodExecutionStatusEnum.BEGIN); MethodExecutionEvent endEvnt = new MethodExecutionEvent(this, "cn.cutter.start.event methodToMonitor方法触发事件", MethodExecutionStatusEnum.END); //发布
this.applicationEventPublisher.publishEvent(beginEvnt); //
System.out.println("进行 methodToMonitor 业务方法本体"); //发布
this.applicationEventPublisher.publishEvent(endEvnt); } }
测试方式:
@Test
public void testSpringEvent() { ApplicationContext ctx = this.before(); cn.cutter.start.event.MethodExeuctionEventPublisher methodExeuctionEventPublisher = (cn.cutter.start.event.MethodExeuctionEventPublisher) ctx.getBean("methodExeuctionEventPublisher"); methodExeuctionEventPublisher.methodToMonitor(); }
操作结果:
【sping揭秘】9、容器内部事件发布(二)的更多相关文章
- 【sping揭秘】8、容器内部事件发布(一)
容器内部事件发布 Spring的applicationContext容器提供的容器内事件发布功能,是通过java提供的自定义事件实现的 事件类型:eventObject 类继承 事件监听:eventL ...
- 深入理解Spring的容器内事件发布监听机制
目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监 ...
- 【spring源码学习】spring的事件发布监听机制源码解析
[一]相关源代码类 (1)spring的事件发布监听机制的核心管理类:org.springframework.context.event.SimpleApplicationEventMulticast ...
- 从spring源码汲取营养:模仿spring事件发布机制,解耦业务代码
前言 最近在项目中做了一项优化,对业务代码进行解耦.我们部门做的是警用系统,通俗的说,可理解为110报警.一条警情,会先后经过接警员.处警调度员.一线警员,警情是需要记录每一步的日志,是要可追溯的,比 ...
- Spring事件发布与监听机制
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 目录 ...
- Nacos源码分析-事件发布机制
温馨提示: 本文内容基于个人学习Nacos 2.0.1版本代码总结而来,因个人理解差异,不保证完全正确.如有理解错误之处欢迎各位拍砖指正,相互学习:转载请注明出处. Nacos的服务注册.服务变更等功 ...
- Spring 源码(8)Spring BeanPostProcessor的注册、国际化及事件发布机制
上一篇文章https://www.cnblogs.com/redwinter/p/16198942.html介绍了Spring的注解的解析过程以及Spring Boot自动装配的原理,大概回顾下:Sp ...
- Spring之事件发布系统
springboot应用,启动spring容器大致有如下几个过程: 容器开始启动 初始化环境变量 初始化上下文 加载上下文 完成 对应的Spring应用的启动器的监听器可以监听以上的过程,接口如下: ...
- C#编程语言之委托与事件(二)—— C#事件
前面已经大致讲述了C#委托的一些基础知识点,本文接下来的内容是C#中的事件(Event),在此我提个建议,如果是刚接触C#的委托类型的朋友可以先看到这里,等熟悉了委托的使用之后(大约1-2天)再来了解 ...
随机推荐
- [转]图解CSS的padding,margin,border属性(详细介绍及举例说明)
图解CSS的padding,margin,border属性 W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层 ...
- 使用hibernate从一方获取多方信息时报错:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role
引起原因:hibernate加载关联对象的方式有懒加载方式和立即加载方式. 如果在多对一的配置中没有指定加载方式,而一对多的配置中指定了懒加载方式,因此在获取一方是可获取到值,而获取多方时sessio ...
- readystatechange事件
IE为DOM文档中的某些部分readystatechange事件. 这个事件的目的是提供与文档或元素的加载状态有关的信息,但是这个事件的行为有时候也很难预测. 支持readystatechange事件 ...
- oracle 11g中文乱码解决的办法一
oracle中文乱码解决的办法 正常安装完oracle客户端后,插入数据时,发现中文都是问号. PLL/SQL中输入select userenv('LANGUAGE') From Dual,结果为AM ...
- (打表+优化)简单的求和 -- zzuli -- 1783
http://acm.zzuli.edu.cn/problem.php?id=1783 1783: 简单的求和 Time Limit: 1 Sec Memory Limit: 128 MBSubmi ...
- input.php
<?php /** * */ class Input { function get($index = NULL, $xss_clean = FALSE) { if($index == NULL ...
- HashMap原理、源码、实践
HashMap是一种十分常用的数据结构,作为一个应用开发人员,对其原理.实现的加深理解有助于更高效地进行数据存取.本文所用的jdk版本为1.5. 使用HashMap <Effective JAV ...
- 普通用户开放 sudo 权限
大家都知道 linux 每个目录都是有权限的,所以如果要想在此目录下读写,则要有这个目录的权限,或者就是有 sudo 权限,那怎么给普通用户赋予 sudo 权限呢,下面我们来看一下: 1.先用 roo ...
- 1.java面向对象编程三大特性之封装
封装即把一个对象的属性.行为等放在一个实体类中隐藏起来,不允许外部对其进行修改,但是被封装的属性.行为会对外提供一个接口与外部联系,这个对外的接口通常情况下就是set().get()方法.可以通过se ...
- PB函数大全【转自 http://blog.csdn.net/xiaoxian8023 】
Abs()功能计算绝对值.语法Abs ( n )参数n:要得到绝对值的数值型变量或表达式返回值返回值的数据类型与n的数据类型相同,函数执行成功时返回n的绝对值.如果参数n的值为NULL,Abs()函数 ...