当前位置: 首页 > news >正文

天津建设银行招聘网站杭州最大定制app开发公司

天津建设银行招聘网站,杭州最大定制app开发公司,办公室设计方案,做海报的网站类似于创客贴在上一篇文章中 #xff0c;我们学习了基于Observer / Event Listener和Mediator模式的基于事件的通信。 由于它们的缺点#xff0c;我想展示基于事件的通信的更有效方法。 我们将从Google Guava EventBus开始#xff0c;以CDI #xff08;Java EE平台的上下文和依赖注入我们学习了基于Observer / Event Listener和Mediator模式的基于事件的通信。 由于它们的缺点我想展示基于事件的通信的更有效方法。 我们将从Google Guava EventBus开始以CDI Java EE平台的上下文和依赖注入结束。 番石榴EventBus Google Guava库具有有用的package eventbus 。 EventBus类允许组件之间进行发布-订阅式通信而无需组件之间进行显式注册。 因为我们开发Web应用程序所以我们应该将此类的实例封装在有作用域的bean中。 让我们编写EventBusProvider bean。 public class EventBusProvider implements Serializable {private EventBus eventBus new EventBus(scopedEventBus);public static EventBus getEventBus() {// access EventBusProvider beanELContext elContext FacesContext.getCurrentInstance().getELContext();EventBusProvider eventBusProvider (EventBusProvider) elContext.getELResolver().getValue(elContext, null, eventBusProvider);return eventBusProvider.eventBus;} } 我仅以一个示例来演示Guava EventBus的所有主要功能。 让我们编写以下事件层次结构 public class SettingsChangeEvent {}public class LocaleChangeEvent extends SettingsChangeEvent {public LocaleChangeEvent(Object newLocale) {...} }public class TimeZoneChangeEvent extends SettingsChangeEvent {public TimeZoneChangeEvent(Object newTimeZone) {...} } 下一步很简单。 要接收事件对象bean应公开一个公共方法该方法以Subscribe批注进行批注该方法接受具有所需事件类型的单个参数。 该对象需要将自身传递给EventBus实例的register方法。 让我们创建两个bean public MyBean1 implements Serializable {PostConstructpublic void initialize() throws Exception {EventBusProvider.getEventBus().register(this);}Subscribepublic void handleLocaleChange(LocaleChangeEvent event) {// do something}Subscribepublic void handleTimeZoneChange(TimeZoneChangeEvent event) {// do something} }public MyBean2 implements Serializable {PostConstructpublic void initialize() throws Exception {EventBusProvider.getEventBus().register(this);}Subscribepublic void handleSettingsChange(SettingsChangeEvent event) {// do something} } 要发布事件只需将事件对象提供给EventBus实例的post方法。 EventBus实例将确定事件的类型并将其路由到所有已注册的侦听器。 public class UserSettingsForm implements Serializable {private boolean changed;public void localeChangeListener(ValueChangeEvent e) {changed true; // notify subscribersEventBusProvider.getEventBus().post(new LocaleChangeEvent(e.getNewValue()));}public void timeZoneChangeListener(ValueChangeEvent e) {changed true; // notify subscribersEventBusProvider.getEventBus().post(new TimeZoneChangeEvent(e.getNewValue()));}public String saveUserSettings() {...if (changed) {// notify subscribersEventBusProvider.getEventBus().post(new SettingsChangeEvent());return home;}} } Guava EventBus允许创建对许多不同事件做出反应的任何侦听器只需使用Subscribe注释许多方法即可。 侦听器可以利用现有事件层次结构。 因此如果侦听器A正在等待事件A并且事件A具有名为B的子类则此侦听器将接收两种类型的事件A和B。在我们的示例中我们发布了三个事件SettingsChangeEventLocaleChangeEvent和TimeZoneChangeEvent。 MyBean1中的handleLocaleChange方法将仅接收LocaleChangeEvent。 方法handleTimeZoneChange将仅接收TimeZoneChangeEvent。 但是请查看MyBean2中的handleSettingsChange方法。 它将接收所有三个事件 如您所见仍然需要手动注册EventBusProvider.getEventBus。registerthis并且在上一篇文章中提到的作用域bean的问题仍然存在。 我们应该注意EventBusProvider的作用域和发布/订阅者bean的作用域。 但是正如您可能还会看到的与Mediator模式相比我们有了一些改进不需要特殊的接口没有固定定义订户的方法名也可以进行多侦听器不花精力管理注册的实例等等。但并非最不重要的是-异步AsyncEventBus和对DeadEvent的订阅用于侦听没有侦听器调度的任何事件-便于调试。 请按照本指南将现有的基于EventListener的系统转换为基于EventBus的系统。 CDI上下文和依赖注入 每个符合JEE 6的应用服务器都支持CDIJSR-299规范。 它定义了一组补充服务可帮助改善应用程序代码的结构。 CDI的最著名的实现是OpenWebBeans和JBoss Weld 。 CDI中的事件允许bean完全不依赖地进行交互。 事件生产者引发事件这些事件由容器传递给事件观察者。 这个基本架构听起来像熟悉的Observer / Observable模式但是有很多好处。 事件生产者和事件观察者彼此分离。 观察者可以指定“选择器”的组合来缩小他们将接收的事件通知的范围。 可以立即或延迟通知观察者直到当前事务结束为止。 使用条件观察者方法进行作用域定义时不会感到头痛还记得作用域bean和Mediator / EventBus的问题吗。 条件观察者方法仅在声明观察者方法的bean范围当前处于活动状态时才允许获取已经存在的bean实例而无需创建新的bean实例。 如果观察者方法不是有条件的则将始终创建相应的bean。 您很灵活 在我看来CDI事件机制是进行基于事件的交流的最佳方法。 这个问题很复杂。 让我们只显示基本功能。 观察者方法是带有参数Observes的bean的方法。 public MyBean implements Serializable {public void onLocaleChangeEvent(Observes Locale locale) {...} } 如果观察者方法仅对限定的事件感兴趣则事件参数也可以指定限定符-这些事件具有限定符。 public void onLocaleChangeEvent(Observes Updated Locale locale) {... } 事件限定符只是使用Qualifier定义的普通限定符。 这是一个例子 Qualifier Target({FIELD, PARAMETER}) Retention(RUNTIME) public interface Updated {} 事件生产者使用参数化Event接口的实例触发事件。 该接口的实例通过注入获得。 生产者通过调用Event接口的fire方法并传递事件对象来引发事件。 public class UserSettingsForm implements Serializable {Inject Any EventLocale localeEvent;public void localeChangeListener(ValueChangeEvent e) {// notify all observerslocaleEvent.fire((Locale)e.getNewValue());} } 容器调用所有观察者方法并将事件对象作为事件参数的值传递。 如果任何观察者方法引发异常则容器将停止调用观察者方法并且该异常将由fire方法重新抛出。 上面的Any注释充当所有限定符的别名。 您会看到无需手动注册观察员。 简单 在注入点指定其他限定词也很简单 // this will raise events to observers having parameter Observes Updated Locale Inject Updated EventLocale localeEvent; 您还可以具有多个事件限定符。 该事件将传递给每个具有事件参数的观察者方法该事件参数可以分配事件对象并且除了与事件注入点指定的事件限定符匹配的事件限定符之外没有任何事件限定符。 观察者方法可能具有其他参数这些参数是注入点。 例 public void onLocaleChangeEvent(Observes Updated Locale locale, User user) {... } 动态指定限定符是什么 CDI允许通过AnnotationLiteral获得适当的限定符实例。 这样我们可以将限定符传递给Event的select方法。 例 public class DocumentController implements Serializable {Document document;Inject Updated Deleted EventDocument documentEvent;public void updateDocument() {...// notify observers with Updated annotationdocumentEvent.select(new AnnotationLiteralUpdated(){}).fire(document);}public void deleteDocument() {...// notify observers with Deleted annotationdocumentEvent.select(new AnnotationLiteralDeleted(){}).fire(document);} } 让我们谈谈“条件观察者方法”。 默认情况下如果当前上下文中没有观察者实例则容器将实例化观察者以向其传递事件。 这种行为并不总是令人满意的。 我们可能只想将事件传递给当前上下文中已经存在的观察者实例。 通过在Observes批注中添加receive IF_EXISTS来指定条件观察者。 public void onLocaleChangeEvent(Observes(receive IF_EXISTS) Updated Locale locale) {... } 在此处阅读有关范围和上下文的更多信息。 在这篇简短的文章中我们不能再谈论更多功能例如“具有成员的事件限定符”和“事务观察者”。 我想鼓励大家开始学习CDI。 玩得开心 参考 JSF中基于事件的通信。 新学派的方法 。 来自我们的JCG合作伙伴 Oleg Varaksin来自“软件开发思想”博客。 翻译自: https://www.javacodegeeks.com/2012/07/jsf-event-based-communication-new.html
http://www.zqtcl.cn/news/399594/

相关文章:

  • 织梦网站广告代码如何写网页设计你若安好便是晴天作业
  • 网站建设 上海wordpress 知更鸟 公告
  • 建小说网站需要多少钱罗湖区住房和建设网站
  • 湖南专业网站建设服务做网站的底图尺寸多大
  • 山东省住房与建设厅网站首页有名的wordpress主题商
  • 常州市金坛区网站建设毕业设计代做淘宝好还是网站好
  • 品牌网站建设营销型网站设计网站整合方案
  • 网站开发设计师网站代理什么意思
  • 网站层级关系邯郸品牌商标vi设计策划公司
  • 网站开发产品需求说明小网站代码
  • 苏州网站推广排名网站建设方案范文8篇
  • 自己做考试题目网站广州番禺区美食攻略
  • 广州做网站如何如何制作一个网页
  • 网站定制开发收费标准是多少网站代码优化方案
  • 制作卡牌的网站深圳正规煤气公司
  • 手表网站哪家好网站用图片
  • 群辉nas 做网站wordpress linux 中文
  • 平面设计素材网站排名巩义网站建设方案表
  • 延庆网站制作搜索引擎优化的基础是什么
  • 管理手机网站商城网站备案流程
  • 怀化买房网站网站广告js代码添加
  • 做网站 帮别人卖服务器wordpress主题多页面
  • 代理游戏网站潍坊市建设工程管理处网站
  • 大同推广型网站建设网站规划建设与管理维护第二版答案
  • 做网站需要代码吗户外媒体网站建设免费
  • 做什么网站国外做图标网站
  • 网站建设技术部职责门户网站工作总结
  • 用个人电脑做服务器建网站急切网头像在线制作图片
  • 企业网站制作教程浙江省住房和城乡建设厅网站
  • 一个网络空间如何做两个网站哪个网站兼职做设计比较好