Spring的ApplicationEvent

        event,listener是observer模式一种体现,这里我们介绍ApplicationEvent的使用。

一、如何使用?

1、 建立event

public class BookingCreatedEvent extends ApplicationEvent {

        private static final long serialVersionUID = 3039313222160544111L;

        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;

        }

}

        BookingCreatedEvent需要继承ApplicationEvent。

2、建立listener

@Component

public  class  BookingEventsListener  implements  ApplicationListener <BookingCreatedEvent> {

        private static final Logger log = Logger.getLogger();

        //listener实现

        public void onApplicationEvent(BookingCreatedEvent event) {

                  log.debug("bookingId:" + event.getBooking().getId());

                  //do something 

       }

}

        BookingEventsListener 需要实现ApplicationListener 并重写onApplicationEvent方法。ApplicationListener带泛型,如果泛型参数为BookingCreatedEvent,则表示只监听BookingCreatedEvent类型的事件,如果泛型参数为ApplicationEvent ,则表示监听所有类型的事件。另外可以用@Component来注册组件,这样就不需要在spring的配置文件中指定了。

3、触发event

@Service("bookingService")

@Repository

public class JpaBookingService implements BookingService, ApplicationContextAware {

        private ApplicationContext context;

        public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {

              log.debug("Autowired applicationContext");

              this.context = applicationContext;

        }

        //省略的代码

        @Transactional

        public  void  persistBooking(Booking booking)throws HibernateException, SQLException {

               em.persist(booking);

              log.debug("fire BookingCreatedEvent");

              BookingCreatedEvent bookingCreatedEvent =newBookingCreatedEvent(this, booking);

              //触发event

              this.context.publishEvent(bookingCreatedEvent);

        }

}

        触发要实现ApplicationContextAware,用于引入ApplicationContext,由于bookingService也 是spring组件,所以在系统启动的时候,ApplicationContext已经注入。也可以用如下方式直接注入 ApplicationContext。

@AutowiredprivateApplicationContext applicationContext;

二、有什么好处?    

解耦:

        如上例子,如果客人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或者数据库中转。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 事件和平时所用的回调思想在与GUI(JavaScript,Swing)相关的技术中非常流行。而在Web应用程序的服...
    Java小铺阅读 1,190评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,173评论 19 139
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 3,414评论 0 3
  • 伟民_9c6b阅读 227评论 0 2
  • 2015年12月23日凌晨两点。 感觉脸上有什么毛茸茸的东西在动,爬起来一瞧——一只巨肥的老鼠,居然有我枕头的三分...
    龙孟秋阅读 151评论 0 0

友情链接更多精彩内容