Spring提供了事件机制,实现了观察者模式,可以让事件发布者和事件监听者解耦,事件发布者可以发布时间而不需要知道谁会监听,如果实现了异步事件还不会影响主流业务逻辑。
Spring的事件机制,最常用在系统状态监测,系统日志等不影响主线业务的逻辑处理。
例子:
登录事件
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.springframework.context.ApplicationEvent;
public class LoginEvent extends ApplicationEvent {
private static final long serialVersionUID = 7574015506926006629L;
private final Map<String, Object> params = new HashMap<String, Object>();
public LoginEvent(Object source) {
super(source);
}
public void addParam(String key, Object value) {
this.params.put(key, value);
}
public Map<String, Object> getParams() {
return Collections.unmodifiableMap(params);
}
}
登录处理类,例如将登录人数加1
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class LoginCounterHandler implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent arg0) {
if (arg0 instanceof LoginEvent) {
// TODO refresh login count
System.out.println("a user login to system");
}
}
}
发布事件
LoginEvent event = new LoginEvent(this);
event.addParam("name", "foo");
ApplicationContextProvider.getApplicationContext().publishEvent(event);
为了实现异步事件处理,这里需要重新实现SimpleApplicationEventMulticaster
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.core.task.TaskExecutor;
public class AsyncApplicationEventMulticaster extends SimpleApplicationEventMulticaster {
private TaskExecutor taskExecutor = new TaskExecutor() {
ExecutorService exeserv = Executors.newCachedThreadPool();
public void execute(Runnable task) {
exeserv.execute(task);
}
};
protected TaskExecutor getTaskExecutor() {
return this.taskExecutor;
}
}
另外为了容易获取applicationContext,加了一个ApplicationContextProvider
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext ctx = null;
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
ctx = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return ctx;
}
}
bean配置
<bean name="applicationEventMulticaster" class="org.jamie.domo.spring.context.AsyncApplicationEventMulticaster" ></bean>
<bean id="applicationContextProvider" class="org.jamie.domo.spring.context.ApplicationContextProvider"></bean>
<bean name="loginCounterHandler" class="org.jamie.domo.spring.context.LoginCounterHandler"></bean>
总结:真是要感谢Spring提供了很多现成的模式让我们的系统更加的松耦合,给我们带来了很多便利。
分享到:
相关推荐
首先,我们需要了解Spring异步调用的基础概念。在Spring中,你可以通过`@Async`注解标记一个方法为异步执行。这个注解来自`org.springframework.scheduling.annotation`包,它会将该方法委托给Spring的异步任务执行...
使用Spring事件机制实现异步的方法 Spring框架提供了一种事件机制,允许开发者将代码解耦合,实现松散耦合的设计理念。这里将详细介绍如何使用Spring事件机制实现异步的方法。 事件机制的实现主要包括三个部分:...
在Spring MVC框架中,异步模式允许我们处理耗时的操作,如大数据处理、长时间的网络请求等,而不阻塞主线程。这种方式提高了系统的响应速度,改善了用户体验。本篇文章将深入探讨Spring MVC中的异步处理机制,以及...
在Spring 3.0版本之后,引入了对异步处理的支持,这极大地提高了应用程序的性能和响应速度。本文将深入探讨Spring 3.0及后续版本中的异步方法,特别是结合Spring MVC、Spring和MyBatis框架的异步示例。 ### 1. 异步...
Spring异步工具类
一、Spring异步线程池类图 Spring提供了一系列的`TaskExecutor`实现,它们根据不同的需求和场景有不同的特性和行为。这些实现包括但不限于: 1. `SimpleAsyncTaskExecutor`:每次请求都会启动新的线程,不进行线程...
在现代应用中,高效地处理并发任务是至关重要的,Spring为此提供了异步任务处理的功能,可以显著提升系统的响应速度和性能。本文将深入探讨在Spring中如何利用多线程和动态任务来实现异步处理,并分享一些实践心得。...
Spring提供了支持异步方法的日志记录,并通过`@Transactional`注解实现事务管理,但需要注意的是,事务管理默认只对同步方法有效,对于异步方法,需要额外配置。 ### 7. `@Async`的限制与注意事项 - 异步方法不能...
本教程将带你逐步了解如何利用Tomcat、Spring和JMS(Java Message Service)构建一个简单的异步消息传递入门实例。 首先,让我们来理解一下核心组件: 1. **Tomcat**:这是一个流行的开源Java Servlet容器,用于...
在构建一个基于Spring的简单高效通用异步任务处理系统时,我们的主要目标是实现轻量级、简单、高效、通用、高扩展性和高可靠性的解决方案。在这个系统中,我们将利用Spring框架的功能,如Job调度和线程池封装,以及...
在Spring MVC框架中,文件上传是一项常见的功能,无论是普通的文件上传还是通过Ajax实现的异步文件上传,都为用户提供了更好的交互体验。本篇将详细讲解这两种方式的实现原理及步骤。 首先,让我们来理解一下普通...
在Spring框架中,`ApplicationContext`不仅是一个容器,用于管理Bean的生命周期和依赖注入,它还提供了事件发布和监听的功能。这个特性使得Spring应用能够实现组件间的异步通信,类似于消息队列(MQ)的工作模式。...
在Spring Boot中,启用`async`异步调用是一项关键功能,它允许应用程序在处理请求时启动一个后台任务,而不必等待该任务完成。这在处理耗时操作时尤其有用,如大数据计算、发送电子邮件或文件上传等。下面将详细阐述...
在这个“最全的Spring MVC注解例子”中,我们将深入探讨Spring MVC的核心注解,以及如何实现异步请求处理和错误管理。 1. **Spring MVC核心注解** - `@Controller`:标记一个类为处理HTTP请求的控制器。这是Spring...
在Spring框架中,事件管理是一种强大的机制,它允许在应用程序组件之间传递消息,而无需这些组件之间有直接的依赖关系。这种松耦合的方式提高了代码的可维护性和可测试性。接下来,我们将深入探讨Spring事件管理的...
总的来说,这个压缩包中的代码片段展示了如何在Spring中利用`@Bean`注解和`initMethod`属性实现异步bean初始化,结合Sofaboot框架,提升应用程序的启动效率和并发性能。通过这些类的设计和交互,我们可以看到Spring...
Spring Boot 异步请求和异步调用
**DWR(Direct Web Remoting)集合Spring实现异步提交** DWR(Direct Web Remoting)是一种开源JavaScript库,它允许Web应用程序在客户端与服务器之间进行实时、双向通信,从而实现异步数据交换。结合Spring框架,...