java事件监听机制,spring中的event listener模式和解耦
来源:互联网 发布:淘宝店铺怎么运营推广 编辑:程序博客网 时间:2024/06/08 03:59
event,listener是observer模式一种体现,在spring 3.0.5中,已经可以使用annotation实现event和eventListner里。
我们以spring-webflow里的hotel booking为例,看一下实现,步骤如下:
触发要实现ApplicationContextAware,用于引入ApplicationContext,由于bookingService也是spring组件,所以在系统启动的时候,ApplicationContext已经注入。也可以用如下方式直接注入ApplicationContext。
我们以spring-webflow里的hotel booking为例,看一下实现,步骤如下:
1,建立event
package com.fcc.event;import com.fcc.model.Booking;import org.springframework.context.ApplicationEvent;public class BookingCreatedEvent extends ApplicationEvent { private Booking booking; public BookingCreatedEvent(Object source){ super(source); } public BookingCreatedEvent(Object source, Booking booking) { super(source); this.booking = booking; } public Booking getBooking() { return booking; }}
event需要继承ApplicationEvent。
2,建立listener
package com.fcc.listener;import com.fcc.event.BookingCreatedEvent;import org.springframework.context.ApplicationListener;import org.springframework.stereotype.Component;@Componentpublic class BookingEventsListener implements ApplicationListener<BookingCreatedEvent> { //listener实现 public void onApplicationEvent(BookingCreatedEvent event) {// log.debug("bookingId:" + event.getBooking().getId()); System.out.println("bookingId:" + event.getBooking().getId()); }}
listener需要实现ApplicationListener。
注意在spring 3.0.5中的ApplicationListener是带泛型的,这样BookingEventsListener只会监听BookingCreatedEvent事件。
另外可以用@Component来注册组件,这样就不需要在spring的配置文件中指定了。
3,触发event
@Servicepublic class BookingService implements ApplicationContextAware {// @Autowired// private ApplicationContext context; private ApplicationContext context; public void setApplicationContext(ApplicationContext applicationContext) { this.context = applicationContext; }//事件源 @Transactional public void persistBooking(Booking booking) { System.out.println("插入数据库");// em.persist(booking);// log.debug("fire BookingCreatedEvent"); BookingCreatedEvent bookingCreatedEvent = new BookingCreatedEvent(this, booking); //触发event this.context.publishEvent(bookingCreatedEvent); }}
触发要实现ApplicationContextAware,用于引入ApplicationContext,由于bookingService也是spring组件,所以在系统启动的时候,ApplicationContext已经注入。也可以用如下方式直接注入ApplicationContext。
@Autowired private ApplicationContext context;
那么event listener这种模式的好处是什么呢?举个例子,如果客人booking了hotel以后,系统要发email给客人,那我们就可以在listener的do something处加入发送email的代码。
上面我们讲起用@Component把listener注册成了spring的组件,这样listener的用途是在runtime的时候解耦。
而如果我们把listener用配置文件的方式注册的话,主要的用途是在部署时解耦。
在实际应用中,两种情况都有。
另外要注意的一点是,service和listener是同步的,在service中的persistBooking有注册@Transactional的情况下,listener中的do something和service中的persistBooking是在同一个tansaction下。
如果要做异步,需要通过MQ或者数据库中转。
阅读全文
0 0
- java事件监听机制,spring中的event listener模式和解耦
- spring中的event listener模式和解耦
- Java 中的事件监听机制
- java中的事件监听机制
- Event-Listerner事件监听模式
- JSP事件监听机制(Listener)
- 监听者模式(Listener-Event)---hibernate - 设计模式
- Spring中的事件监听机制在项目中的应用
- Jsp/Servlet中的Listener事件监听
- java事件监听机制
- java事件监听机制
- matlab event listener机制
- spring event-listener模型
- [JAVA]Listener监听模式的学习
- tomcat 中的事件监听机制
- 详解java的事件监听机制和观察者设计模式
- Java中的事件监听
- java中的事件监听
- Java中面向对象分拣存储
- 自定义view实现流式布局
- PenTbox工具学习入门
- nginx的重定向与反向代理
- Masonry介绍与使用实践(快速上手Autolayout)
- java事件监听机制,spring中的event listener模式和解耦
- MTK平台user版本下怎样开启和抓取MTKlog
- Oracle 之 ORA-01847: day of month must be between 1 and last day of month
- --nodeps强制删除pcre后再安装报错
- curl模拟提交(post)
- 剑指offer:用两个栈实现队列
- 服务器搭建:servlet+dao+javabean+jsp实现简单的用户登录(一)
- [NOIP模拟][数位DP]准考证号
- 非极大值抑制(NMS)