Java Web项目中的Event

[b](1)Servlet的事件和监听器[/b]

[img]http://dl2.iteye.com/upload/attachment/0125/2759/3676c175-c965-3d13-bb81-b386e72503c3.png[/img]

*** Servlet、Filter、Listener 是单例的
*** 通过 @WebListener 或者 web.xml 来注册

[b](2)Spring 的 ApplicationEvent[/b]

[quote]Publisher -> (ApplicationEvent) -> Listener[/quote]

[b]a)Spring内置事件[/b]
[quote]ContextRefreshedEvent
ContextStartedEvent
ContextStoppedEvent
ContextClosedEvent
RequestHandledEvent[/quote]

[b]b)自定义事件[/b]
public class MyEvent extends ApplicationEvent {

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

// 可以定义任意参数的构造函数,用于传递需要的参数
}


[b]c)事件监听@EventListener、ApplicationListener[/b]

spring4.1之前:
public class MyListener1 implements ApplicationListener<ContextClosedEvent> {
@Override
public void onApplicationEvent(ContextClosedEvent event) {
}
}


从spring4.2开始可以
public class MyListener2 {
@EventListener
public void processContextStoppedEvent(ContextStoppedEvent event) {
}
@EventListener
public void processContextClosedEvent(ContextClosedEvent event) {
}
}


也可以同时捕获多个事件
@EventListener({ContextRefreshedEvent.class, ContextStoppedEvent.class, ContextStartedEvent.class})
public void handleContextEvent () {
}


[b]d)发布事件ApplicationEventPublisher[/b]

@Autowired
private ApplicationEventPublisher eventPublisher;

eventPublisher.publishEvent(new MyEvent(this));


也可以通过在Listener中再次返回一个Event来继续发布一个事件,从而实现发布多个事件。
@EventListener
public MyAnotherEvent handleMyEvent(MyEvent event) {
// ... 处理MyEvent
return new MyAnotherEvent();
}


[b]e)异步执行[/b]

Listener默认是在发布事件的线程中执行的。

[b]通过@Async实现异步[/b]

把 @EventListener 标注的方法再标注 @Async 可实现异步执行。

[b]通过ApplicationEventMulticaster实现异步[/b]
@Bean
ApplicationEventMulticaster applicationEventMulticaster() {
SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster();
eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
eventMulticaster.setErrorHandler(TaskUtils.LOG_AND_SUPPRESS_ERROR_HANDLER);
return eventMulticaster;
}


[b]f)条件执行[/b]

从spring4.3开始正式提供基于 SpEL 来指定事件执行的条件
@EventListener(condition = "#myEvent.amount >= 100")
public void handleHighBids(MyEvent event) {
// ...
}



[b]g)@TransactionalEventListener[/b]

同步事件监听是的事务问题

比如需要在事务正确提交后在执行监听:
@TransactionalEventListener
public void handleAfterCommit(TaskScheduledEvent event)
// ...
}


或者指定在事务的某状态时执行监听:
@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
public void handleAfterRollback(TaskScheduledEvent event) {
// ...
}



参考:
https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2
http://zoltanaltfatter.com/2016/05/11/application-events-with-spring/
http://kimulla.hatenablog.com/entry/2016/09/23/125006
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值