`
cyril0513
  • 浏览: 15708 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用Spring的事件机制

阅读更多
最近一个项目,我们应用了Spring的事件机制,它是基于观察者设计模式的思想,但是有点差异的是还需要实现ApplicationContextAware,因为我们要拿到applicationContext来触发我们的事件,然后由Spring回调,将对象传进来,这样我们就可以很方便的访问所有的Bean,或者做一些其他的事情,比如发布事件。
还需要实现一个ApplicationListener,这个就是我们的观察者了,表示当某个事件被触发了,我们该做点什么。
其次就需要去定义事件,例如流程结束事件,一个购物系统当订单流程已经结束了,我们需要通知发货员发货,这个时候我们的这个通知发货,就是一个观察者,我们需要实现通知,比如短信,邮件通知,来告知物流
定制自己的事件,需要继承ApplicationEvent。
下面这幅图,是我画的很简单的一个图,这就是核心的方法和核心的类。

然后我们看看源代码是怎么做的:
//这个其实很简单,调用转交给multicastEvent方法。
public void publishEvent(ApplicationEvent event) {
		Assert.notNull(event, "Event must not be null");
		if (logger.isTraceEnabled()) {
			logger.trace("Publishing event in " + getDisplayName() + ": " + event);
		}
		getApplicationEventMulticaster().multicastEvent(event);
		if (this.parent != null) {
			this.parent.publishEvent(event);
		}
	}


//当某个事件被触发,这里会轮训的通知整个Application的观察者,所以我们在每个观察中都要判断一下,该事件源和事件,是不是我们需要关心的。否则每个都要跑一遍
@SuppressWarnings("unchecked")
	public void multicastEvent(final ApplicationEvent event) {
		for (final ApplicationListener listener : getApplicationListeners(event)) {
			Executor executor = getTaskExecutor();
			if (executor != null) {
				executor.execute(new Runnable() {
					public void run() {
	//这里回调我们的listener中的对应处理逻辑					listener.onApplicationEvent(event);
					}
				});
			}
			else {
				listener.onApplicationEvent(event);
			}
		}
	}

样例:
自定义的事件:
public class PersonFullEvent extends ApplicationEvent {

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

}

public class MessageService implements ApplicationListener,
		ApplicationContextAware {

	private ApplicationContext context;
	private List<Person> persons = new ArrayList<Person>(5);

	public void addMessage(Person p) {
		if (persons.size() > 5) {
			context.publishEvent(new PersonFullEvent(p));
			return;
		}
		persons.add(p);
	}

	public void onApplicationEvent(ApplicationEvent event) {

		Object eventSource = event.getSource();
                  //这里一定要判断事件源
		if (!(eventSource instanceof Person))
			return;
                  //判断事件源之后,还要判断是否是这个事件,因为一个事件源可能有多个事件。但我们这里只是关心这个事件

		if (event instanceof PersonFullEvent) {
			System.out.println("test event successful");
		}

	}

	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		context = applicationContext;

	}

测试代码:

ApplicationContext context = new ClassPathXmlApplicationContext(
				new String[]{"bean.xml"});
	MessageService ms = context.getBean(MessageService.class);
		Person p=new Person();
		for(int i=0;i<10;i++)
		{
			ms.addMessage(new Person());
		}


Spring的另一个对外接口非常好用,ApplicationListener,这个接口是当Spring做某些事情之后会发出一个对应的事件,其实就是一个观察者模式.
比如:我们判断整个Spring容器启动完毕之后,我们需要做一些相应的动作,例如校验集群中是否存在同名服务器等,如果存在则退出。

public class ClusterCheck implements ApplicationListener, DisposableBean{
   
    public void onApplicationEvent(ApplicationEvent event) {
      //Spring容器启动完毕会发出ContextRefreshedEvent事件
      if (event == null || !(event instanceof     ContextRefreshedEvent))
			return;
       //然后这里做相应的自身的逻辑

    }



}


  • 大小: 17.3 KB
分享到:
评论

相关推荐

    使用Spring事件机制实现异步的方法

    使用Spring事件机制实现异步的方法 Spring框架提供了一种事件机制,允许开发者将代码解耦合,实现松散耦合的设计理念。这里将详细介绍如何使用Spring事件机制实现异步的方法。 事件机制的实现主要包括三个部分:...

    spring事件机制

    Spring框架的事件机制是其核心特性之一,它提供了一种基于发布-订阅模式的事件处理方式,使得在Spring应用中的不同组件之间可以进行解耦通信。这个机制允许一个组件(通常是一个服务)触发一个事件,然后其他感兴趣...

    深入探索Spring事件监听机制:技术与应用

    Spring事件监听机制是Spring框架中的一个重要特性,它基于经典的观察者模式,允许应用程序组件之间进行松耦合的通信。在Spring中,事件监听机制由三部分组成:事件(ApplicationEvent)、事件监听器(Application...

    event.rar-Spring事件监听机制

    在Spring框架中,事件监听机制是一种非常重要的组件间通信方式,它允许应用程序的不同部分通过发布和订阅事件来进行异步通信。这种模式使得组件之间松耦合,提高了代码的可维护性和可扩展性。下面我们将详细探讨...

    EventBus与Spring Event区别详解(EventBus 事件机制,Spring Event事件机制)

    Spring Event的事件机制可以与Spring Framework的其他组件集成,例如Spring MVC、Spring Boot等。这种机制可以使应用程序更加灵活和可扩展。 EventBus与Spring Event的区别 EventBus和Spring Event都是事件机制,...

    详解Spring事件驱动模型

    一、Spring事件机制的工作流程 1. 定义事件:创建自定义的事件类,继承自`ApplicationEvent`。例如,可以创建一个`CustomEvent`表示特定业务操作完成的事件。 2. 注册监听器:编写`ApplicationListener`接口的实现...

    spring事件的例子

    在Spring框架中,事件处理是一种重要的组件间通信方式。它允许一个对象在完成特定操作后,通知其他对象这一事实,而无需这些对象之间有直接的依赖关系。这种机制基于Java的观察者模式(Observer Pattern),使得松...

    spring缓存机制-入门实例

    本篇文章将深入探讨Spring缓存机制的基础知识,并通过一个入门实例来阐述其工作原理和使用方法。 Spring缓存抽象是自Spring 3.1版本引入的,它提供了一个统一的API,支持多种缓存解决方案,如EhCache、Guava Cache...

    Spring的事件监听机制示例详解

    在Spring中,事件发布者可以使用ApplicationContext的publishEvent方法来发布事件,而事件监听者可以使用@EventListener注解来监听事件。 5. Spring事件机制的应用 Spring事件机制有很多实际应用场景,例如: * ...

    wechat-pay-master.zip

    微信支付-简单易用 & Spring ...使用 spring 事件机制封装了微信支付通知,以简化使用方式。wiremock 是一个 web mock server,配置中可配置微信 API 的 basePath, 所以你可以使用 wiremock 构建一个完全的仿真环境。

    spring运行机制源码剖析

    Bean工厂是Spring的基础,它使用XML配置文件或者基于注解的配置来定义Bean的实例化和装配。当Spring启动时,会读取配置文件并根据配置创建Bean实例。BeanFactory通过依赖注入(DI)将对象之间的关系解耦,使得代码更...

    spring 事件处理

    在Spring框架中,事件处理是一种重要的通信机制,它允许组件之间进行解耦的通信。Spring事件处理基于发布/订阅模式,其中事件是消息的载体,而事件监听器则是对这些消息感兴趣的订阅者。在这个场景中,我们将探讨...

    JAVA-spring学习资源之spring事件

    总结来说,Spring事件机制为组件间的通信提供了一种灵活的方式,减少了组件之间的耦合。理解和掌握这一特性,将有助于你构建更加健壮、易于维护的Spring应用程序。通过实践和探索"JAVA-spring学习资源之spring事件...

    SPRING事务机制DEMO

    Spring事务机制是Java开发中非常重要的一个概念,它在企业级应用中扮演着核心角色,确保数据的一致性和完整性。Spring提供了多种事务管理方式,包括编程式事务管理和声明式事务管理。在这篇DEMO中,我们将重点探讨...

    Spring事件管理

    在Spring框架中,事件管理是一种强大的机制,它允许在应用程序组件之间传递消息,而无需这些组件之间有直接的依赖关系。这种松耦合的方式提高了代码的可维护性和可测试性。接下来,我们将深入探讨Spring事件管理的...

    spring笔试题选择和简答题和springboot+cloud选择题和简答题

    答:Spring 事件机制是使用订阅和发布模式。 题目 12: 下列关于 Spring Boot 热部署方式不正确的是? 答:下列关于 Spring Boot 热部署方式都是正确的。 题目 13: 下列关于 Spring 事件机制不正确的是? 答:...

    Spring事务传播机制.docx

    Spring 事务使用 AOP 的机制实现,会在@Transactional 注解修饰的方法前后分别织入开启事务的逻辑,以及提交或回滚的逻辑。@Transactional 可以修饰在方法或者类上,区别就在于修饰于类上的,会对该类下符合条件的...

    Spring的配置以及事件注入

    本篇文章将深入探讨Spring的配置和事件注入机制,帮助开发者更好地理解和利用这些特性。 首先,让我们关注Spring的配置。Spring的配置主要有两种方式:XML配置和Java配置。在早期的Spring版本中,XML配置是最常用的...

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...

    spring 事件监听 3种方式

    Spring事件监听机制使得我们可以松散地耦合应用程序组件,提高代码的可维护性和扩展性。根据项目需求和场景,可以选择合适的方式实现事件监听。基于接口的监听器适合于早期版本的Spring,基于类的监听器提供了一种更...

Global site tag (gtag.js) - Google Analytics