cdi 2.7.5_看一下CDI 2.0 EDR1

cdi 2.7.5

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,将在Event触发时选择事件观察器。 您可以通过使用类型或其子类型来通知另一组事件观察者。 因此,没有可用的全局事件观察者顺序,这导致我们使用@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。 对于Java EE和SE,CDI是一个热门话题,并且仍然非常有吸引力。 请继续关注并遵循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

cdi 2.7.5

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

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

相关文章

linux make命令_第一章 1.3Linux下安装Redis

1.3.2 Linux下安装Redis第一步: 去官网下载安装包 ,传送门第二步: 上传到Linux服务器,解压redis的安装包tar -zxvf redis-6.0.8.tar.gz这里我已经解压好了,并且移动到了redis目录下第三步: 安装基本环境yum -y insatll gcc-c这里注意一个问题,Centos下安装的gcc默认版本为4.8.5…

C语言strcpy函数的使用

点击蓝字关注我们strcpy简单使用&#xff1a; #include <stdio.h> #include <string.h>struct Student {int sid;char name[20];int age;} st; //此处分号不可省略int main(void) {struct Student st {1000,"zhangsan",20};printf("%d %s %d\n&…

jooq_使用jOOQ DSL

jooq本文是我们学院课程“ jOOQ –类型安全数据库查询”的一部分 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多而JDBC过于抽象时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特定语言如何可以极大…

什么镜头最适合拍风景_为什么您的风景摄影套件中应始终装有远摄镜头

当您考虑风景摄影镜头时&#xff0c;许多摄影师只考虑广角镜头。14-24mm f / 2.8或24-70mm f / 2.8等经典镜头是用于风景的流行光学元件。它们是绝佳的选择但是&#xff0c;也值得在风景摄影套件中使用长焦镜头。为什么要使用长镜头进行风景摄影&#xff1f;您在网上或浏览Inst…

C++ STL详解(3)

点击蓝字关注我们简介set 是 关联容器 的一种&#xff0c;是排序好的集合&#xff08;元素已经进行了排序&#xff09;。set 和 multiset 类似&#xff0c;它和 multiset 的差别在于 set 中不能有重复的元素。multiset 的成员函数 set 中也都有。使用 set 必须包含 #include<…

【lua学习】8.协程

1 数据结构和宏1.1 协程的状态码1.2 协程的执行状态码1.3 lua_State 协程结构体2 C API2.1 lua_newthread 新建一个协程&#xff0c;压栈&#xff0c;返回这个新协程2.2 luaE_freethread 释放一个协程L12.3 lua_status 获取协程的错误码2.4 lua_resume 唤醒一个协程&#xff0c…

检测到基于堆栈的缓冲区溢出_检测到堆栈粉碎

检测到基于堆栈的缓冲区溢出我敢打赌&#xff0c;每个Java开发人员在他们的职业生涯开始时第一次遇到Java代码的本机方法时都会感到惊讶。 我还可以肯定&#xff0c;多年来随着了解JVM如何通过JNI处理对本机实现的调用而使惊奇消失了。 这篇文章是关于本机方法的最新经验。 更…

探讨 C++ 虚函数 virtual

点击蓝字关注我们来源于网络&#xff0c;侵删有无虚函数的对比C 中的虚函数用于解决动态多态问题&#xff0c;虚函数的作用是允许在派生类中重新定义与积累同名的函数&#xff0c;并且可以通过基类指针或引用来访问基类和派生类中的同名函数。首先写两个简单的类&#xff0c;类…

python上一行的代码打错了怎么办_写Python代码过程中碰到各种错误异常要怎么样去处理?...

错误异常即便Python程序的语法是正确的&#xff0c;在程序运行的过程中&#xff0c;也可能发生错误。运行期检测到的错误被称为异常。如果发生了错误&#xff0c;可以事先约定返回一个错误代码&#xff0c;这样&#xff0c;就可以知道是否有错&#xff0c;以及出错的原因。所以…

双重for_测试双重图案

双重for前段时间&#xff0c;我写了一篇有关使用Test Double的后果的文章&#xff0c;但是与Test Double Patterns无关&#xff0c;仅是一个简单的清单。 今天&#xff0c;我想对其进行更改&#xff0c;并解释这些模式之间的差异。 正如我在提到的文章中写道&#xff1a; Tes…

C++ STL详解(4)

点击蓝字关注我们来源于网络&#xff0c;侵删unordered_set / unordered_multiset这两个容器的方法与上一篇 C STL简介&#xff08;3&#xff09; 提到的 set / multiset 基本一样。但是要注意的是&#xff1a;这两个是无序的&#xff0c;基于哈希表实现的&#xff0c;增删改查…

js压缩图片_Web 性能优化: 图片优化让网站大小减少 62%

图像是web上提供的最基本的内容类型之一。他们说一张图片胜过千言万语。但是如果你不小心的话&#xff0c;图片大小有时高达几十兆。因此&#xff0c;虽然网络图像需要清晰明快&#xff0c;但它们尺寸可以缩小压缩的&#xff0c;使用加载时间保持在可接受的水平。在我的网站上&…

春春幼儿园堆积木大赛_春云边车

春春幼儿园堆积木大赛我有一个部署到基于NetflixOSS的云的应用程序&#xff0c;该应用程序具有以下结构&#xff1a; 本质上是一种将信息持久保存到Cassandra集群的服务。 所有应用程序都已注册到Eureka –因此&#xff0c;在本例中&#xff0c;该服务以及Cassandra节点都已在…

C++ 标准输入的行加速

点击蓝字关注我们来源于网络&#xff0c;侵删一、前言c/c 的标准输入函数&#xff0c;在输入一行数据&#xff0c;当数据量比较大的时候&#xff0c; cin 的效率是非常低的&#xff0c;为了加快读入的效率&#xff0c;可以改用 scanf&#xff0c;当然&#xff0c;还有一种利用 …

如何用python 开发web_如何用python开发web

Django是一个Web框架——一套用于帮助开发交互式网站的工具。Django能够响应网页请求&#xff0c;还能让你更轻松地读写数据库、管理用户等。建立Django项目建立Django项目首先需要确保我们按照好了Django&#xff0c;我们在Pycharm中打开虚拟环境的终端&#xff0c;然后输入&a…

redis安装_Redis安装

redis安装本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c…

C++ 自动锁

点击蓝字关注我们来源于网络&#xff0c;侵删一、锁1.锁 是 多线程编程 中一个很常用的概念&#xff0c;这里不多加介绍其原理&#xff0c;有兴趣可以参考 临界区 进行更多的了解&#xff1b;2.锁 一般会提供三个接口&#xff1a;加锁&#xff08;Lock&#xff09;、解锁&#…

python快速编程入门黑马程序员pdf_Python快速编程入门 传智播客 黑马程序员 python编程从入门到实践基础视频教程核心编程爬虫数据分析程序设计机器学习简明书籍...

传智播客就业系列从入门到就业JAVA从入门到精通 套装5本&#xffe5;148javaweb从入门到精通套装3本&#xffe5;88Python从入门到实践套装8本&#xffe5;280php教程全套7本&#xffe5;227PHP套装5本&#xffe5;165php全套5本&#xffe5;149android开发从入门到精通 共3本&…

叉叉框架_叉/连接框架

叉叉框架本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01; 目录 1.简介 2…

C++ 浮点数精度判定

点击蓝字关注我们来源于网络&#xff0c;侵删一、引例看下下面这段代码&#xff0c;会输出什么结果呢&#xff1f;double x 0;for (int i 0; i < 10; i) {x 0.1;}printf("%d\n", x 1);输出如下&#xff1a;0引起这种反差的原因就是浮点误差&#xff0c;浮点数…