我试图在CDI容器抛出的事件的上下文中理解@Initialized()事件的生命周期/流程,这些事件在扩展中是可观察到的。
根据WELD 2文档,容器生命周期事件是:
我很难弄清楚在这个容器生命周期中,@Initialized
事件将在何处触发。我怀疑这是AfterDeploymentValidation完成的,但我找不到任何文档来支持这一事实。此外,我似乎在CDI 1.1规范中找不到任何规定@Initized事件何时何地抛出的内容。
例如,事件是在执行发现的bean的所有@PostConstruct
方法之前还是之后引发的?事件是在EJB@Startup
初始化之前还是之后引发的?是否有任何文件明确列出CDI中这些事件的顺序/顺序?
Q1:我很难找到的是在这个容器生命周期中,@Initialized事件会在哪里被触发。我怀疑它是在DeploymentValidation之后完成的,但是我找不到任何文档来支持这个事实。
如 CDI 1.1 规范第 11.5.4 节中所述。部署后验证事件:
容器必须在验证没有部署问题之后以及在创建上下文或处理请求之前触发事件。
A1:因此,任何作用域的限定符@Initialized
的事件都将在AfterDeploymentValidation
事件之后激发。
Q2:此外,我似乎在CDI 1.1规范中找不到任何规定何时/何地抛出@Inittify事件的内容。
A2:第6.7节。内置范围的上下文管理描述每个内置范围的行为,并为自定义范围实现提供建议:
鼓励可移植扩展在初始化自定义上下文时使用限定符 @Initialized(X.class)
触发事件...
初始化请求上下文时,将触发限定符为 @Initialized(请求范围.class)
的事件...等。
Q3:例如,事件是在执行发现的bean的所有@PostConstruct
方法之前还是之后抛出的?
如6.7所述。内置作用域的上下文管理:
请求范围是活动的:
-…
-在任何bean的@PostCon结构体
回调期间。
应用程序范围是活动的:
-…
-在任何bean的@PostCon结构体
回调期间。
…等等
A3:要激活作用域,首先需要初始化它。因此,具有限定符< code>@Initialized的事件将在任何bean的< code>@PostConstruct回调之前被激发,但仅针对回调中必须处于活动状态的作用域。
Q4:事件是在EJB @Startup
初始化之前还是之后抛出的?是否有任何文件明确列出CDI中这些事件的顺序/次序?
A4:EJB由单独的规范JSR 345:Enterprise JavaBeans TM,版本3.2 EJB核心合同和要求涵盖。
按照4.8.1节的Singleton Session Bean初始化那里:
默认情况下,容器负责决定何时初始化单例会话bean实例。然而,Bean Provider可以选择配置单例会话Bean以进行紧急初始化。如果Startup注释出现在单例会话bean类上,或者如果单例会话bean已通过部署描述符指定为需要紧急初始化,则容器必须在应用程序启动序列期间初始化单例会话bean实例。在将任何外部客户端请求(即源自应用程序外部的客户端请求)传递到应用程序中的任何企业bean组件之前,容器必须初始化所有此类启动时单例会话bean
在某些情况下,应用程序中的多个单例会话bean组件之间存在显式初始化排序依赖关系。DependsOn
注释用于表示这些依赖关系。在一个单例会话bean必须在一个或多个其他单例会话bean之前初始化的情况下,使用DependsOn
依赖项。容器确保在调用<code>PostConstruct</code>方法之前,与单例会话bean具有<code>DependsOn</code<关系的所有单例会话bean都已初始化。
因此,带有限定符 @Initialized
的事件也将在 EJB Bean 回调之前触发@PostConstruct
但仅限于必须在回调中处于活动状态的作用域。