`

Spring特性——事件驱动模型

阅读更多

原创内容,转载请注明出处

1、Spring事件模型

事件驱动模型是一种观察者模式的典型应用,或者叫发布——订阅模型,Java中awt的事件机制和Spring的事件机制都是观察者模式的应用。

一般都是发布者有更改变动时,订阅者会接收到发布者的变动通知。

举个通用的例子网上看新闻,首先我们需要去订阅新闻,当有新的新闻时,网站会自动推送新闻给已经订阅过该新闻的用户。

新建新闻Xinwen,代码如下

 

package com.test.springevent;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;

public class Xinwen implements ApplicationContextAware{

	private ApplicationContext applicationContext;
	private String content;
	
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;
	}

	public ApplicationContext getApplicationContext() {
		return applicationContext;
	}
	
	public void process(){
		content = "新闻:小米销售额在国内第一";
		applicationContext.publishEvent(new XinwenApplicationEvent(content));
	}
	

	
	
}

 

新建新闻事件XinwenApplicationEvent,代码如下

 

package com.test.springevent;

import org.springframework.context.ApplicationEvent;

public class XinwenApplicationEvent extends ApplicationEvent {

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

}

 

创建用户1 User1,代码如下

package com.test.springevent;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class User1 implements ApplicationListener<ApplicationEvent> {

	public void onApplicationEvent(ApplicationEvent event) {
		if(event instanceof XinwenApplicationEvent){
			System.out.println("用户1查看新闻");
			System.out.println(event.getSource());
		}
	}

}

 

创建用户2 User2,代码如下

package com.test.springevent;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class User2 implements ApplicationListener<ApplicationEvent> {

	public void onApplicationEvent(ApplicationEvent event) {
		if(event instanceof XinwenApplicationEvent){
			System.out.println("用户2查看新闻");
			System.out.println(event.getSource());
		}
	}

}

 

创建bean.xml文件,内容如下

 

    <!-- 测试Spring事件机制 -->
    <bean class="com.test.springevent.User1"/>
    <bean class="com.test.springevent.User2"/>
    <bean id="xinwen" class="com.test.springevent.Xinwen"/>

 

创建Junit测试代码

	/**
	 * 测试spring事件
	 */
	@Test
	public void testSpringEvent(){
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml"); 
		Xinwen xinwen = (Xinwen) applicationContext.getBean("xinwen");
		xinwen.process();
	}

 

创建bean.xml

 

测试结果如下

 

 

2、代码分析

1.在Spring的ApplicationContext篇幅中有大致提到Spring事件多路广播器ApplicationEventMulticaster的初始化和监听器ApplicationListener的注册。

 

2.Spring的监听器ApplicationListener实现了Java的EventListener事件监听器接口类,故而我们只需实现ApplicationListener接口。

 

3.Spring事件ApplicationEvent类继承了EventObject接口类,如有需要,我们只需要继承ApplicationEvent事件。

 

4.Spring发布事件接口类是ApplicationEventPublisher,然而ApplicationContext实现了ApplicationEventPublisher接口,故而可以直接调用ApplicationContext的PublishEvent方法发布事件。

 

5.跟踪ApplicationContext的发布事件方法代码可知,实际ApplicationContext容器是委托事件多路广播器ApplicationEventMulticaster来发布事件的。ApplicationEventMulticaster在IOC容器初始化时被初始化,同时会将ApplicationLisener监听器注册给事件多路广播器,当然IOC容器也支持代码式注册监听器。

 

6.ApplicationEventMulticaster(实现子类SimpleApplicationEventMulticaster)在发布事件时,支持异步发布,只需在ApplicationEventMulticaster实例中注入Java的Executor实例,即通过多线程来完成事件异步发布。

3、Spring事件异步发布

 在bean.xml文件添加如下bean配置。

    <!-- 测试Spring事件机制 异步发布事件 -->
    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="5"></property>
    </bean>
    <bean id="applicationEventMulticaster" class="org.springframework.context.event.SimpleApplicationEventMulticaster">
    	<property name="taskExecutor" ref="taskExecutor"></property>
    </bean>

 

在User1和User2中加入打印当前线程语句。

public void onApplicationEvent(ApplicationEvent event) {
		if(event instanceof XinwenApplicationEvent){
			System.out.println(Thread.currentThread());
			System.out.println("用户2查看新闻");
			System.out.println(event.getSource());
		}
	}

  

测试结果如下



 

如上测试结果可知,两个用户查看新闻是不同线程,即SimpleApplicationEventMulticaster类通过多线程,来实现异步发布事件。

 

源代码如附件

  • 大小: 18.8 KB
  • 大小: 18.1 KB
分享到:
评论

相关推荐

    Spring——jar包详解

    7. **Spring Test**:提供了一组工具,用于测试Spring配置和Spring驱动的应用程序。 了解了Spring的基本模块后,我们来看看如何在实际项目中使用jar包。通常,我们需要在项目的类路径下包含相应的Spring库,例如`...

    使用 Spring 2.5 基于注解驱动的 Spring.pdf

    Spring 2.5基于注解驱动的SpringMVC配置方式代表了现代Web应用开发的一个重要趋势——减少XML配置,增强代码的自描述性和可维护性。通过上述核心注解的使用,开发人员能够更快速、高效地构建响应式、可扩展的Web应用...

    小读spring ioc源码(一)——整体介绍

    Spring提供了事件驱动模型,使得容器内的Bean可以相互通信。当某个事件发生时,容器会广播事件,感兴趣的Bean可以通过实现ApplicationListener接口来监听并处理事件。 6. **容器扩展** Spring的扩展性非常强,...

    使用 Spring 2.5 基于注解驱动的 Spring MVC

    注解驱动是Spring 2.5的一个重要特性,它简化了Spring MVC的应用程序开发过程。传统的Spring MVC应用程序通常需要在XML配置文件中进行大量的手动配置,包括定义各种Bean、配置请求映射等。这种方式虽然有效,但相对...

    使用 Spring 2_5 基于注解驱动的 Spring MVC

    在本主题中,我们将深入探讨Spring框架的2.5版本引入的一个重要特性——基于注解的Spring MVC配置。Spring MVC是Spring框架的一部分,专门用于构建Web应用程序,它提供了一个模型-视图-控制器(MVC)架构来组织和...

    Spring5 源码分析(第 2 版)-某Tom老师

    最后,Spring5的事件驱动模型(Event-driven Model)也是值得关注的部分,它允许应用组件之间通过发布和订阅事件来进行通信。文档会讲解ApplicationEvent和ApplicationListener接口的使用,以及自定义事件的发布和...

    spring——mvc

    Spring MVC 是一款基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 ...随着经验的增长,可以进一步探索 Spring Security、Spring Data、Spring Boot 等高级特性,提升你的开发技能。

    spring完整demo实例

    首先,Spring的核心特性——依赖注入,是它简化软件开发的关键。依赖注入允许我们解耦组件,使得代码更加模块化,易于测试和维护。通过配置文件或注解,我们可以声明一个对象需要哪些其他对象作为依赖,Spring会自动...

    最新版spring-framework-4.3.10.RELEASE-dist完整包

    13. **事件驱动架构**:Spring支持事件驱动编程模型,允许组件之间通过发布和监听事件进行通信。 14. **国际化的支持**:Spring提供对多语言环境的支持,帮助开发者轻松创建国际化应用。 以上只是Spring Framework...

    Spring之IOC示例

    以及事件驱动模型,允许bean之间进行通信。 此外,Spring框架还提供了大量的工具类和模块,如数据访问/集成层(包括JDBC、ORM支持)、Web MVC、Test支持等,覆盖了完整的应用程序开发周期。 总之,Spring的IOC特性...

    spring-core.

    Spring Core支持事件驱动模型,允许应用组件之间通过发布和订阅事件进行通信。通过`ApplicationEvent`和`ApplicationListener`接口,开发者可以定义自己的事件和监听器。 六、类型转换与格式化 Spring Core提供了...

    spring-5.0.4(全)最新spring资源包

    6. **WebFlux**:Spring 5引入了一个全新的Web编程模型——WebFlux,它是基于反应式编程的,适用于低延迟、高并发场景,提供了非阻塞的处理模型。 7. **Spring Boot 2.0兼容**:Spring 5与Spring Boot 2.0紧密配合...

    基于spring boot,spring cloud,axon framework的领域驱动设计的-Taroco.zip

    《基于Spring Boot、Spring Cloud与Axon Framework的领域驱动设计实践——Taroco项目解析》 在现代企业级应用开发中,Spring Boot和Spring Cloud已成为构建微服务架构的标准选择。Spring Boot简化了Spring应用的...

    spring响应式编程实战pdf和markdown

    传统的Servlet容器在处理请求时会创建线程并等待响应,而WebFlux利用非阻塞I/O和事件驱动模型,显著提高了系统资源的利用率和并发性能。 6. **错误处理**: 响应式编程中的错误处理是声明式的,可以通过订阅者链上的...

    利用Spring实现工作流

    此外,Spring还提供了事件驱动的机制,可以用来处理异步工作流任务。例如,当某个事件发生(如用户提交表单),我们可以发布一个事件,由监听该事件的处理器启动或推进工作流实例。 为了确保工作流的可测试性,我们...

    spring-kafka源代码

    此外,通过Spring的AOP和事件驱动模型,可以方便地扩展和插拔功能。 总结 Spring Kafka源代码揭示了其内部的工作原理,从生产者和消费者的实现,到配置、异常处理和扩展性设计,都体现了Spring框架的一贯设计理念...

    spring5.1.8.zip

    3. **Spring WebFlux**:Spring 5引入了一个全新的响应式编程模型——Spring WebFlux,它支持非阻塞式I/O,适用于高并发、低延迟的场景。在5.1.8版本中,WebFlux的性能和稳定性都得到了提升。 4. **数据访问**:...

    spring3标签库

    这两个主要的TLD(Tag Library Descriptor)文件——`spring-form.tld`和`spring.tld`,提供了丰富的自定义标签,帮助开发者更高效、更直观地处理数据绑定、表单渲染以及模型对象的操作。 首先,让我们深入了解一下...

    spring 3.0 jar包

    Spring 3.0的Web MVC模块引入了ModelAndView类的替代品——Model,使得模型数据的处理更加简洁。另外,新增了@ModelAttribute注解,用于将请求参数绑定到模型对象上。同时,对RESTful风格的URL支持也有所加强。 6....

Global site tag (gtag.js) - Google Analytics