原创内容,转载请注明出处
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类通过多线程,来实现异步发布事件。
源代码如附件
相关推荐
7. **Spring Test**:提供了一组工具,用于测试Spring配置和Spring驱动的应用程序。 了解了Spring的基本模块后,我们来看看如何在实际项目中使用jar包。通常,我们需要在项目的类路径下包含相应的Spring库,例如`...
Spring 2.5基于注解驱动的SpringMVC配置方式代表了现代Web应用开发的一个重要趋势——减少XML配置,增强代码的自描述性和可维护性。通过上述核心注解的使用,开发人员能够更快速、高效地构建响应式、可扩展的Web应用...
Spring提供了事件驱动模型,使得容器内的Bean可以相互通信。当某个事件发生时,容器会广播事件,感兴趣的Bean可以通过实现ApplicationListener接口来监听并处理事件。 6. **容器扩展** Spring的扩展性非常强,...
注解驱动是Spring 2.5的一个重要特性,它简化了Spring MVC的应用程序开发过程。传统的Spring MVC应用程序通常需要在XML配置文件中进行大量的手动配置,包括定义各种Bean、配置请求映射等。这种方式虽然有效,但相对...
在本主题中,我们将深入探讨Spring框架的2.5版本引入的一个重要特性——基于注解的Spring MVC配置。Spring MVC是Spring框架的一部分,专门用于构建Web应用程序,它提供了一个模型-视图-控制器(MVC)架构来组织和...
最后,Spring5的事件驱动模型(Event-driven Model)也是值得关注的部分,它允许应用组件之间通过发布和订阅事件来进行通信。文档会讲解ApplicationEvent和ApplicationListener接口的使用,以及自定义事件的发布和...
Spring MVC 是一款基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 ...随着经验的增长,可以进一步探索 Spring Security、Spring Data、Spring Boot 等高级特性,提升你的开发技能。
首先,Spring的核心特性——依赖注入,是它简化软件开发的关键。依赖注入允许我们解耦组件,使得代码更加模块化,易于测试和维护。通过配置文件或注解,我们可以声明一个对象需要哪些其他对象作为依赖,Spring会自动...
13. **事件驱动架构**:Spring支持事件驱动编程模型,允许组件之间通过发布和监听事件进行通信。 14. **国际化的支持**:Spring提供对多语言环境的支持,帮助开发者轻松创建国际化应用。 以上只是Spring Framework...
以及事件驱动模型,允许bean之间进行通信。 此外,Spring框架还提供了大量的工具类和模块,如数据访问/集成层(包括JDBC、ORM支持)、Web MVC、Test支持等,覆盖了完整的应用程序开发周期。 总之,Spring的IOC特性...
Spring Core支持事件驱动模型,允许应用组件之间通过发布和订阅事件进行通信。通过`ApplicationEvent`和`ApplicationListener`接口,开发者可以定义自己的事件和监听器。 六、类型转换与格式化 Spring Core提供了...
6. **WebFlux**:Spring 5引入了一个全新的Web编程模型——WebFlux,它是基于反应式编程的,适用于低延迟、高并发场景,提供了非阻塞的处理模型。 7. **Spring Boot 2.0兼容**:Spring 5与Spring Boot 2.0紧密配合...
《基于Spring Boot、Spring Cloud与Axon Framework的领域驱动设计实践——Taroco项目解析》 在现代企业级应用开发中,Spring Boot和Spring Cloud已成为构建微服务架构的标准选择。Spring Boot简化了Spring应用的...
传统的Servlet容器在处理请求时会创建线程并等待响应,而WebFlux利用非阻塞I/O和事件驱动模型,显著提高了系统资源的利用率和并发性能。 6. **错误处理**: 响应式编程中的错误处理是声明式的,可以通过订阅者链上的...
此外,Spring还提供了事件驱动的机制,可以用来处理异步工作流任务。例如,当某个事件发生(如用户提交表单),我们可以发布一个事件,由监听该事件的处理器启动或推进工作流实例。 为了确保工作流的可测试性,我们...
此外,通过Spring的AOP和事件驱动模型,可以方便地扩展和插拔功能。 总结 Spring Kafka源代码揭示了其内部的工作原理,从生产者和消费者的实现,到配置、异常处理和扩展性设计,都体现了Spring框架的一贯设计理念...
3. **Spring WebFlux**:Spring 5引入了一个全新的响应式编程模型——Spring WebFlux,它支持非阻塞式I/O,适用于高并发、低延迟的场景。在5.1.8版本中,WebFlux的性能和稳定性都得到了提升。 4. **数据访问**:...
这两个主要的TLD(Tag Library Descriptor)文件——`spring-form.tld`和`spring.tld`,提供了丰富的自定义标签,帮助开发者更高效、更直观地处理数据绑定、表单渲染以及模型对象的操作。 首先,让我们深入了解一下...
Spring 3.0的Web MVC模块引入了ModelAndView类的替代品——Model,使得模型数据的处理更加简洁。另外,新增了@ModelAttribute注解,用于将请求参数绑定到模型对象上。同时,对RESTful风格的URL支持也有所加强。 6....