上周,JCP 发布了CDI 1.1的公共审查草案。这份草案继续对1.0规范进行增量改进。我们没有添加任何重大新功能,而是专注于完善1.0 :-)
- CDI类,它提供了从托管Bean外部对CDI设施进行编程访问的功能使用
- @Vetoed声明性地撤销Bean的能力
- Servlet请求中的会话
- Java EE中的应用生命周期事件
- Bean的注入元数据到Bean实例中以编程方式访问由容器提供的
- 生产者InjectionTarget, AnnotatedType, 能够通过
- 覆盖元数据到Bean实例中viaBeanAttributes
- 能够通过ProcessModule
- 能够包装InjectionPoint
- 尊重WEB-INF/classes/META-INF/beans.xml以激活WEB-INF/classes在Bean存档中
- 全局顺序和启用拦截器和装饰器
- 全局选择替代方案
- @New已弃用
- 阐明拦截器和装饰器必须使用代理实现
- 允许每个Java类有多个注释类型
- 允许扩展指定它们感兴趣的注释
关于这些问题,我们非常欢迎您的反馈
Bean可见性
CDI 1.0规范明确指出,只有那些Bean类可访问(使用标准类加载器可见性规则)的Bean才能被注入到另一个Bean中。例如,如果您有一个位于WAR中的Bean A,假设标准Java EE类加载器结构,它就不会在EJB模块中的Bean B中可用,用于注入。这通常是有意义的,因为类型本身也是不可见的。
CDI还提供两种选项来透明地替换Bean实现,而不需要明确选择该实现(无论是通过类型还是使用限定符) - 替代方案和特殊化。在这种情况下,专门化Bean的Bean类或选择的替代方案的Bean类必须是可见的,这一点不太明确。
CDI EG仍在讨论这个问题,包括是否在这里提供向后不兼容的模式。
@ApplicationScoped所有EAR模块之间共享的bean
CDI实现尚未在所有EAR模块之间一致地共享bean。@ApplicationScoped这个问题与Bean可见性密切相关。CDI 1.1规范将明确说明它们是如何共享的。@ApplicationScoped的。
启动事件
一个常见的功能请求是,使应用程序能够在启动后但在开始处理远程请求之前做一些工作。目前CDI 1.1定义了@Initialized(ApplicationScoped.class)当应用程序上下文启动时被调用,但我们正在研究是否可以将其扩展为提供更通用的启动事件。
如果我们定义这样的事件,我们需要允许自定义上下文在它执行时激活自己,但这可能超出了CDI 1.1的范围,并可能将在CDI 2.0中解决。
@WithAnnotations
CDI 1.1添加了@WithAnnotations允许一个扩展观察ProcessAnnotatedType过滤它看到的类型。我们希望为所有容器生命周期事件观察者提供此类功能,但有一些有趣的事情需要考虑,包括是否应该对后来的事件使用限定符进行过滤。CDI 1.1可能或可能不会添加此类支持,我们正在寻求对此的反馈。
允许数组作为限定符成员
CDI 0.0要求限定符的数组值成员必须用@Nonbinding注释,将其排除在解析过程之外。JDK定义,数组值成员的注解相等性应该使用Arrays.equals(),这需要两个完全相同的数组(相等值,顺序相同)才能返回true。
我们认为,为了让限定符的数组值成员有用,我们需要提供一种可插拔的策略来检查数组的等价性,因为通常我们希望考虑具有相同值的两个数组(无论顺序如何)为相等。我们打算为CDI 1.1添加这个功能。
限制CDI扫描的内容
CDI 0.0将扫描具有beans.xml的jar中的所有类。我们计划添加一种语法,这将允许应用程序开发者使用各种过滤选项(例如,通过包)排除类。Weld提供了这样的语法,并将作为CDI https://docs.jboss.net.cn/weld/reference/1.1.5.Final/en-US/html/configure.html#d0e5769的起点。beans.xml
观察者解析
CDI 0.0要求用于观察者解析的类型基于事件对象的运行时类型。遗憾的是,JDK抹去了我们需要的关于对象泛型类型的信息,以允许以参数化类型触发许多事件。CDI 0.0还完全忽略了注入的事件对象的泛型类型,该类型通常包含所需类型信息。因此,我们打算更改事件观察者解析规则,以便如果运行时事件对象不包含足够信息,则考虑事件对象的泛型类型。
请注意,这可能看起来像是一个向后不兼容的更改,但是CDI 0.0在今天是基本不可实现的——规范中的示例按描述无法工作。