Weld 2.0.0.Beta1 已经发布。Weld 2 是 CDI 1.1 的参考实现。此版本实现了 CDI 1.1 公共评审草案。您可以在 Pete 的博客文章 中了解更多关于 CDI 草案的信息。
在众多变更中,以下是我想要强调的:
全局启用和拦截器、装饰器和替代品的排序
CDI 中经常被误解和不喜欢的一部分是拦截器、装饰器和替代品的启用。CDI 1.0 要求在每个应使用拦截器/装饰器/替代品的 bean 存档中显式启用。
CDI 1.1 增强了这一概念,并提供了一种全局启用拦截器、装饰器和替代品的方法。这样的全局启用组件仅定义在一个 bean 存档中,并定义了一个优先级,该优先级决定了其全局排序。优先级较低的拦截器和装饰器首先被调用。对于替代品,如果有多个启用的替代品与相同的注入点匹配,则具有较高优先级的替代品获胜。
<decorators> <class priority="100">org.mycompany.myfwk.TimestampLogger</class> <class priority="200">org.mycompany.myfwk.IdentityLogger</class> </decorators>
可变上下文和显式依赖销毁
CDI 1.1 添加了一种通过销毁现有上下文实例来节省资源的能力。在 SPI 方面,引入了 AlterableContext 接口,该接口公开了 destroy() 操作。destroy()如果在一个上下文引用被访问之后,其底层实例已被销毁,则 CDI 容器会透明地初始化一个新的实例。
此外,内置的实例bean 现在公开了一个destroy()操作,可用于
- 释放使用实例
- 销毁正常作用域实例(上述 SPI 方法的快捷方式)获得的依赖实例
内置 bean 的装饰
装饰器的领域已扩展以支持对CDI内置bean的装饰。以下内置bean支持装饰:
- 事件
- 实例
- 会话
- HttpServletRequest / HttpSession / ServletContext
- InjectionPoint
- Principal
- UserTransaction
新的扩展最热门的候选人包括事件(事件排序)和会话(会话开始/结束事件)
根据存在的注解过滤ProcessAnnotatedType事件
CDI 1.1引入了@WithAnnotations注解。此注解可用于扩展观察器方法,以更精确地指定观察器方法感兴趣的事件。
void observeTypesWithInject(@Observes @WithAnnotations(Inject.class) ProcessAnnotatedType<?> event) { // TODO: process types }
在上面的示例中,扩展观察器方法仅通知定义了@Inject注解的AnnotatedTypes。指定的注解可以出现在类型或任何超类型上,也可以出现在类型或超类型声明的任何字段、方法或构造函数上,或者出现在类型或超类型声明的任何方法或构造函数的任何参数上。注解可以作为元注解应用于任何考虑的注解。
这允许通过通过@WithAnnotations暴露的附加信息来实现更简单的CDI扩展和更快的CDI容器,因为容器可以执行引导优化。
除了实施规范变更外,此版本还修复了30多个错误。我们还对Weld的性能进行了改进。大型部署的引导性能现在显著提高,我们还对CDI绑定的拦截器的运行时性能进行了微调。
与以往一样,此版本还附带CDI TCK版本,其中包含对新的CDI 1.1功能的测试。
更新:这次没有现成的AS7发行版。相反,Weld捆绑包包含一个安装程序,您可以使用它来修补任何现有的JBoss AS 7.1.1.Final或更高版本。只需遵循readme文件中的说明即可。
尝试使用Weld 2,并给我们反馈。请注意,CDI 1.1尚未最终确定,因此如果您不喜欢CDI中的某些内容,还有时间进行改进!
[发行版(Weld,CDI TCK)] [发布说明(Weld,CDI TCK)] [ CDI 1.1 PRD Javadoc ]