看一下CDI 2.0 EDR1

CDI是最近对Java EE最好的补充之一。 该观点在用户和集成商之间广泛共享。 当前版本的CDI 1.2于2014年4月发布。现在,在2015年中期,我们将面对CDI 2.0规范的早期草案。 CDI 2.0将在Java 8和更高版本上运行。

最终版本计划于2016年发布,该路线图包含几个有趣的项目:

  • 将API分为Java SE和Java SE两部分:拆分API是支持微服务移动的重要步骤。 从几行中的每个main()引导CDI。
  • 异步事件和优先事件允许控制事件观察者的排序和异步传递事件
  • JDK 8:CDI 1.x针对Java 1.6及更高版本。 Java 8进行了许多改进,并有助于简化CDI的API。
  • CDI允许从起源开始扩展。 SPI非常适合使用DeltaSpike,Spring Data,Camel,CDI度量标准等框架来增强CDI。 CDI 2.0旨在改善对扩展的支持
  • 你知道吗? CDI大量使用AOP来实现非常舒适的使用。 所有常规范围(例如RequestScoped,ConversationScoped,SessionScoped和ApplicationScoped)都使用代理来查找上下文实例。 但是一个极限规范是,CDI不允许在本地方法调用上进行自我注入或拦截。 AOP软件包将解决这些问题并改进规范的某些部分。

但是,让我们看一下CDI 2.0 EDR的API(早期草案审查),它是新的且值得注意的

异步事件

异步事件是CDI用户希望列表上的第一项。 该问题在2011年初提出,是CDI 2.0的重点之一。 为了启用异步处理的事件并且不通过引入异步性破坏现有代码,需要进行大量热烈讨论。 当前草案需要双端激活

public class AsyncEvents {@Injectprivate Event<MyEventPayload> event;public void triggerEvent() {event.fireAsync(new MyEventPayload());}public void asyncEventObserver(@ObservesAsync MyEventPayload payload) {System.out.println("Yay, I'm called async!");}public void eventObserver(@Observes MyEventPayload payload) {System.out.println("Yay, I'm called too. " + "Other @Observes are notified in order.");}public static class MyEventPayload {}
}

可以通过对启用了异步功能的观察者的异步处理来触发事件。 使用@Observes观察者也会在调用线程中得到通知。 可以使用调用fireAsync时返回的CompletionStage跟踪异步事件观察器的CompletionStage fireAsync

当事件处理处于活动状态时,异步事件观察器可以在上下文Bean实例上进行操作。 默认情况下,启用的范围是@RequestScoped@ApplicationScoped 。 该@SessionScoped被排除variuous原因。 只要考虑一下会话在事件处理过程中结束时的行为方式即可。 在上下文实例中修改事件有效负载或数据时,用户应注意效果。 CDI不会强制事件有效负载保持不变,但强烈建议您避免由于并发而导致竞争情况。

CDI容器负责提供多线程基础结构。 有时,您想提供一个自己的执行程序来控制并发级别或包装异步调用。 fireAsync方法允许为每个调用指定单独的执行程序。

private ExecutorService executor;@Injectprivate Event<MyEventPayload> event;@PostConstructpublic void postConstruct() {int threads = Runtime.getRuntime().availableProcessors();executor = new ThreadPoolExecutor(threads, threads, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());}@PreDestroypublic void preDestroy() {executor.shutdown();}public void triggerEventWithExecutor() {event.fireAsync(new MyEventPayload(), executor);}

上面的示例创建/销毁执行器。 您可以将CDI管理的执行器与生产者方法( @Produces )结合使用,并在需要的地方@Inject 。 CDI很酷,是吗?

异步事件将仍然是一个热门话题,这肯定不是其最终形式。

有序事件观察者

在CDI 1.2中,使用事件观察器时的通知顺序是不可预测的。 在2.0中,这将发生变化。

public class PrioritizedEvents {@Injectprivate Event<MyEventPayload> event;public void trigger() {event.fire(new MyEventPayload());}public void observeBeforeOtherObservers(@Observes @Priority(Interceptor.Priority.APPLICATION + 499) MyEventPayload payload) {System.out.println("Notified before all other observers");}public void observeAfterOtherObservers(@Observes @Priority(Interceptor.Priority.APPLICATION + 501) MyEventPayload payload) {System.out.println("Notified after all other observers");}public static class MyEventPayload {}
}

事件观察者的顺序可以通过应用@Priority注释来影响。 为什么受到影响却不受控制?

这个问题的答案更长一些,您需要了解CDI的类型安全解析部分。 事件观察者是根据其事件有效负载类型选择的。 事件观察者可以观察不同的类型,接口,类,子类型,合格和不合格类型。 通过使用EventBeanManager API,可以在触发事件时选择事件观察器。 您可以通过使用类型或其子类型来通知另一组事件观察者。 因此,没有可用的全局事件观察者顺序,这导致我们使用@Priority批注。

通过应用@Priority可以提前通知某些事件观察者,并在以后通知它们。 默认值为Interceptor.Priority.APPLICATION + 500 ,结果为2500 。 这是所有不带有@Priority批注的事件观察器的默认值。

仔细观察@Priority发现,它仅适用于当前类型。 这将更改,直到CDI 2.0最终确定。

Java SE的CDI

JavaSE的CDI从一开始就可用,或者我这样说:您可以在JavaSE中启动Weld和OpenWebBeans,而无需JavaEE容器。 CDI 2.0仅指定了以标准方式引导CDI容器的标准方法。 这是我个人的最爱。

public class CDIJumpStart {public static void main(String[] args) {try(CDI<Object> cdi = CDI.getCDIProvider().initialize()) {cdi.select(MyApp.class).get().runMyApplication();}}private static class MyApp{public void runMyApplication(){// ...}}
}

该代码将启动CDI容器并调用一种方法来运行您的应用程序。 应用程序完成后,将使用try-with-resources模式关闭容器。 用来启动一个独立的,可能是微服务式应用程序的代码比Spring Boot长两行。 与Spring或Dropwizard的主要区别在于生态系统,我找不到现成的嵌入式Tomcat的集成。 我猜想,JavaSE的CDI成为真正的微服务框架之类的替代品要花费一些时间。

结论

CDI 2.0 EDR只是正在进行的JSR365工作的很小的成果。 有很多问题需要讨论和说明。 JBoss的Weld团队会为规范的发展而努力,并会在将来的某个地方提出RI。 CDI是一个热门话题,并且对于Java EE和SE仍然非常有吸引力。 请继续关注并遵循CDI 2.0

与CDI规范联系:

  • Spec网站: http : //www.cdi-spec.org/
  • GitHub: https : //github.com/cdi-spec/cdi
  • 主要邮件列表: https : //lists.jboss.org/mailman/listinfo/cdi-dev
  • CDI 2.0 JCP页面: http : //jcp.org/en/jsr/summary? id = 365
  • IRC:irc://freenode.net/#cdi-dev
  • 推特:@cdispec
  • Google+: https : //plus.google.com/+CdiSpecOrgPage/posts

翻译自: https://www.javacodegeeks.com/2015/09/a-look-on-cdi-2-0-edr1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis key设计技巧

1: 把表名转换为key前缀 如, user: 2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid 3: 第3段放置主键值,如2,3,4...., a , b ,c 4: 第4段,写要存储的列名 用户表 user , 转换为key-value存储 userid username passworde email 9 Lisi 1111111 li…

python编程游戏代码 游戏人物如何升级_如何玩游戏提高python编程技能?

笔者公众号&#xff1a;技术杂学铺Python Challenge是首个谜语编程网站。挑战者需要连续挑战33个需要编程才能解开的谜题以锻炼自己的编程能力。该网站建立于2005年&#xff0c;至今已经有三百多万位访客浏览并尝试解决该网站的谜题。python challenge 官网虽然网站建立的年代比…

Eclipse配置初始化(自用)

以上都是性能调优的配置&#xff0c;下面是其他常用的配置和优化 设置utf-8编码 window -> preferences -> General -> workplace中text file encoding改为utf-8 设置properties文件编码window -> preferences -> General -> Content Types —> Text —&g…

java bits_一段关于JAVA程序升级的问题(Changing bits)

展开全部import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;import javax.…

hibernate脏数据_Hibernate性能提示:脏收集效果

hibernate脏数据在使用Hibernate作为ORM开发服务器和嵌入式应用程序8年后&#xff0c;我全力以赴地寻求提高Hibernate性能的解决方案&#xff0c;阅读博客和参加会议&#xff0c;我决定与您分享在这些年中获得的知识。 这是更多新帖子中的第一篇&#xff1a; 去年&#xff0c;…

有关struts2中用到 js 总结

1.js中取Struts2中的栈里的值 var current "${currentPage}"; 2.js 如何提交执行提交url连接 &#xff0c;以及 Struts中的url如何如何写 var current "${currentPage}"; location.href"showSeparatePageGoods.action?currentPage"current&q…

java合并两个有序链表_JS实现的合并两个有序链表算法示例

本文实例讲述了JS实现的合并两个有序链表算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例&#xff1a;输入&#xff1a;1->2->4, 1->3->4输出&…

外墙设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

8.25小结

1.导出csv文件 后台导出&#xff1a;CSVUtils工具类&#xff1a; /*** * CSV文件导出工具类* * author* reviewer*/ public class CSVUtils {public static File createCSVFile(List<Object> head, List<List<Object>>dataList, String outPutPath, String f…

java 监控 native 内存_JVM NativeMemoryTracking 分析堆外内存泄露

Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能。我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据。NMT介绍工欲善其事必先利其器&#xff0c;我们先把相关需要的配置和工具介绍清楚&#xff0c;再通过例子来看看具体如何使用NMT。打开NMT…

Charles 从入门到精通

目录与版权 转载请保留顶部的 Charles 中国特惠内容&#xff0c;本文的内容主要包括&#xff1a; Charles 的简介如何安装 Charles将 Charles 设置成系统代理Charles 主界面介绍过滤网络请求截取 iPhone 上的网络封包截取 Https 通讯信息模拟慢速网络修改网络请求内容给服务器做…

javafx11 最佳实践_JavaFX移动应用程序最佳实践,第1部分

javafx11 最佳实践到现在为止&#xff0c;所有对JavaFX感兴趣的人都会知道&#xff0c;JavaFX Mobile发行了不久 前。 可以肯定的是&#xff0c;这真是令人难以置信。 我感到非常筋疲力尽&#xff0c;在发行期间我什至没有精力去写博客…… 但是到目前为止&#xff0c;我感到很…

java 批量验证_正则表达式批量验证函数

正则表达式批量验证函数function checkData(){//判断数据的正确性var idSpans new Array();idSpans[0] new Array("item_4","^[\\s\\S]{1,16}$","productName","商机名称应在1-16字以内","",true); idSpans[1] new Array(…

css3制作炫酷导航栏效果 转

今天主要利用hover选择器。鼠标滑过查看效果。 一。普通导航栏 HomeContentServiceTeamContact对于这种普通的导航栏&#xff0c;只是鼠标滑过的时候颜色会变&#xff0c;所以思路变得很简单。 &#xff08;1&#xff09;使用ul标签布局 &#xff08;2&#xff09;鼠标经过事件…

桥梁设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

java计算面积的方法_JAVA多态计算面积main函数调用方法

public static void main(String[] args) {Shape shape;Scanner input new Scanner(System.in);System.out.println("请选择图形(1、圆形 2、矩形 3、三角形)");int a input.nextInt();if(a 1){System.out.println("请输入圆形的边长&#xff1a;");dou…

C# 5.0新加特性

1. 异步编程 在.Net 4.5中&#xff0c;通过async和await两个关键字&#xff0c;引入了一种新的基于任务的异步编程模型&#xff08;TAP&#xff09;。在这种方式下&#xff0c;可以通过类似同步方式编写异步代码&#xff0c;极大简化了异步编程模型。如下式一个简单的实例&…

java 生成缩略图类_JAVA生成【缩略图】方法

/*** 创建缩略图片** param orgpath* param filename* return* description: 描述*///此方法对于ssh项目并且针对 上传功能时&#xff0c;非常有用public static Boolean createAbbreviateImg(String orgpath, String filename) {Boolean flag true;String filetype orgpath.…

简单的遮罩层加登录窗效果

<!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>遮罩层加登录窗</title> <style type"text/css"> #wrap{width: 60px;height: 30px; position: absolute; text-align: center; line-height: 30…

java上机面试题 039_深入 Java 虚拟机之面试总结篇

在学习 JVM 相关知识&#xff0c;怎么让自己有动力看下去&#xff0c;且有思考性呢&#xff1f;笔者认为&#xff0c;开头用一些常用的面试题&#xff0c;来引入读者的兴趣比较好&#xff0c;这样才会有看下去的动力。所以&#xff0c;该篇文章会以面试总结的方式&#xff0c;希…