小吃网站建设,详情页面设计模板,体验营销策略,seo关键词优化最多可以添加几个词介绍 在应用程序内交换事件已成为许多应用程序中必不可少的部分#xff0c;幸运的是#xff0c;Spring为瞬态事件#xff08;*#xff09;提供了完整的基础结构。 最近对事务绑定事件的重构为我提供了一个借口#xff0c;以在实践中检查Spring 4.2中引入的新的注释驱动事件… 介绍 在应用程序内交换事件已成为许多应用程序中必不可少的部分幸运的是Spring为瞬态事件*提供了完整的基础结构。 最近对事务绑定事件的重构为我提供了一个借口以在实践中检查Spring 4.2中引入的新的注释驱动事件监听器。 让我们看看可以得到什么。 *–对于基于Spring的应用程序中的持续事件 Duramen是一个值得一看的解决方案 旧的方式 要获取有关事件Spring事件和自定义域事件的onApplicationEvent 必须创建一个使用onApplicationEvent实现ApplicationListener的组件。 Component
class OldWayBlogModifiedEventListener implementsApplicationListenerOldWayBlogModifiedEvent {(...)Overridepublic void onApplicationEvent(OldWayBlogModifiedEvent event) {externalNotificationSender.oldWayBlogModified(event);}
} 它可以正常工作但是对于每个事件都必须创建一个新类来生成样板代码。 另外我们的事件必须扩展ApplicationEvent类-Spring中所有应用程序事件的基类。 class OldWayBlogModifiedEvent extends ApplicationEvent {public OldWayBlogModifiedEvent(Blog blog) {super(blog);}public Blog getBlog() {return (Blog)getSource();}
} 请注意 在事件中使用域对象有明显的缺点在许多情况下也不是最好的主意。 代码示例中的伪域对象用于不引入不必要的复杂性。 顺便说一句在此示例中 ExternalNotificationSender是类的实例该类向注册用户发送外部通知例如通过电子邮件SMS或Slack。 注释驱动的事件侦听器 从Spring 4.2开始要得到有关新事件的通知它足以在任何带有EventListener注释的Spring组件中注释一个方法。 EventListenerpublic void blogModified(BlogModifiedEvent blogModifiedEvent) {externalNotificationSender.blogModified(blogModifiedEvent);} 在幕后Spring将为事件创建一个ApplicationListener实例该实例的类型来自方法参数。 一类中带注释的方法的数量没有限制-所有相关的事件处理程序都可以分组为一个类。 条件事件处理 为了使EventListener更加有趣可以处理仅满足SpEL编写的给定条件的给定类型的那些事件。 让我们假设以下事件类 public class BlogModifiedEvent {private final Blog blog;private final boolean importantChange;public BlogModifiedEvent(Blog blog) {this(blog, false);}public BlogModifiedEvent(Blog blog, boolean importantChange) {this.blog blog;this.importantChange importantChange;}public Blog getBlog() {return blog;}public boolean isImportantChange() {return importantChange;}
} 请注意在实际的应用程序中可能会存在Blog相关事件的层次结构。 另请注意在Groovy中该类要简单得多。 要仅针对重要更改生成事件可以使用condition参数 EventListener(condition #blogModifiedEvent.importantChange)public void blogModifiedSpEL(BlogModifiedEvent blogModifiedEvent) {externalNotificationSender.blogModifiedSpEL(blogModifiedEvent);}宽松的事件类型层次结构 从历史上看 ApplicationEventPublisher仅具有发布在ApplicationEvent之后继承的对象的功能。 从Spring 4.2开始接口已扩展为支持任何对象类型。 在这种情况下对象将包装在PayloadApplicationEvent并通过发送。 //base class with Blog field - no need to extend ApplicationEvent
class BaseBlogEvent {}class BlogModifiedEvent extends BaseBlogEvent {}//somewhere in the code
ApplicationEventPublisher publisher (...); //injectedpublisher.publishEvent(new BlogModifiedEvent(blog)); //just plain instance of the event 这种变化使发布事件变得更加容易。 但是另一方面如果没有内部责任感例如针对我们所有域事件的标记接口则事件跟踪会变得更加困难尤其是在大型应用程序中。 发布事件以响应 EventListener另一个EventListener是在非无效返回类型的情况下Spring会自动发布返回的事件。 EventListenerpublic BlogModifiedResponseEvent blogModifiedWithResponse(BlogModifiedEvent blogModifiedEvent) {externalNotificationSender.blogModifiedWithResponse(blogModifiedEvent);return new BlogModifiedResponseEvent(blogModifiedEvent.getBlog(), BlogModifiedResponseEvent.Status.OK);}异步事件处理 已更新 。 正如RadekGrębski正确建议的那样 还值得一提的是EventListener可以与Async批注轻松组合以提供异步事件处理。 特定事件侦听器中的代码不会阻止主代码执行也不会阻止其他侦听器进行处理。 Async //Remember to enable asynchronous method execution //in your application with EnableAsyncEventListenerpublic void blogAddedAsync(BlogAddedEvent blogAddedEvent) {externalNotificationSender.blogAdded(blogAddedEvent);} 为了使其正常工作通常只需要使用EnableAsync在Spring上下文/应用程序中启用异步方法执行EnableAsync 。 摘要 Spring 4.2中引入的由注释驱动的事件侦听器继续保持减少基于Spring引导应用程序中样板代码的趋势。 这种新方法看起来很有趣特别是对于具有少量事件且维护开销较低的小型应用程序。 在无处不在的SpringBoot魔术世界中更值得记住的是强大的力量伴随着巨大的责任。 在下一篇博客文章中我将写出如何将新机制也用于简化事务绑定事件的处理。 请注意 Spring Framework 4.2是Spring Boot 1.3的默认依赖项在编写1.3.0.M5时可用。 另外也可以在Gradle / Maven中为Spring Boot 1.2.5手动升级Spring Framework版本–在大多数情况下应该可以使用。 翻译自: https://www.javacodegeeks.com/2015/10/annotation-driven-event-listeners-in-spring-4-2-2.html