Spring Boot————ApplicationListener实现逃课事件监听

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014745069/article/details/84860498

引言

上一篇文章转了一篇关于ApplicationListener用于在Web项目启动时做一些初始化的用法。

但是,在实际生产过程中,当一个事件产生,又是如何被onApplicationEvent()方法监听到,并执行一系列动作呢?简单搜索了一下,终于掌握了从定义事件、发布事件到最后监听方法执行的常规用法,在此记录。

据我了解,spring 底层对监听机制的实现应该用到了观察者模式,关于观察者模式的解释可以参考《Java常用设计模式————观察者模式》。

本篇博客只涉及到关于spring 监听机制的用法,不涉及底层的原理(不过有时间的话一定会进一步整理底层实现的方式),将会通过事件定义监听后操作事件触发(发布)这三个部分来实现一个简单的业务逻辑:监听一个学生的逃课事件,并在事件触发后执行一个有效的措施。

实现步骤

1、定义事件类

事件类需要继承抽象类ApplicationEvent,且必须包含一个有参构造器,这个参数是顶级父类EventObject的一个属性,标识一个与这个事件相关联的资源对象Object。下面代码中的showSkipStuInfo()方法是一个自定义的方法,用于打印一些日志信息。

@SuppressWarnings("serial")
public class SkipClassEvent extends ApplicationEvent {

	private static final Logger logger = LoggerFactory.getLogger(SkipClassEvent.class);

	public SkipClassEvent(Object source) {
		super(source);
	}

	/** 显示逃课学生信息 */
	public void showSkipStuInfo(Student stu) {
		logger.info("逃课学生信息:" + stu.toString());
	}
}

其中,Student是一个只包含 name 和 gender 的简单Java对象:

/** 学生对象 */
public class Student {

	public enum Gender {
		MALE, FAMALE;
	}

	private String name;
	private Gender gender;

	public Student(String name, Gender gender) {
		this.name = name;
		this.gender = gender;
	}

	@Override
	public String toString() {
		return "{name : " + name + ", gender : " + gender + "}";
	}

    // getter...setter...
}

2、编写监听器

自定义的监听器类SkipClassListener实现了ApplicationListener接口的onApplicationEvent方法,并指定监听的事件类型为SkipClassEvent,当事件适时触发时,spring框架会自行调用onApplicationEvent方法

@Component
public class SkipClassListener implements ApplicationListener<SkipClassEvent> {
	private static final Logger logger = LoggerFactory.getLogger(SkipClassListener.class);

	@Override
	public void onApplicationEvent(SkipClassEvent event) {
		Student stu = (Student) event.getSource();
		event.showSkipStuInfo(stu);
		logger.info("采取措施:通知" + stu.getName() + "的家长!!!");
	}
}

3、事件触发

编写一个最简单的Spring Boot单元测试,来观察执行效果。

首先,我们必须获得一个ApplicationContext对象,因为在spring框架中事件的触发要使用ApplicationContext对象publishEvent()方法,实际上从这个方法的命名来看,我们应该称之为“发布事件”,但本人更喜欢将这个调用称为“触发事件”,不过这都没有关系。

(在实际开发中,我们也可以像下面代码这样通过@Autowired注解,将ApplicationContext注入,或者,通过启动类的SpringApplication.run(...)得到这个对象,并把它作为一个类属性(static修饰)来调用)

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
	
	@Autowired
	private ApplicationContext applicationContext;

	@Test
	public void testListener() {
		Student skipStu = new Student("张明", Gender.MALE);
		applicationContext.publishEvent(new SkipClassEvent(skipStu));
	}
}

测试testListener()方法,执行结果如下:

综上,是对事件监听的常规用法总结,欢迎文末留言。

猜你喜欢

转载自blog.csdn.net/u014745069/article/details/84860498