我的 Maven 项目中有这种结构:
WEB-INF/lib
- a.jar
- Registry.class (@ApplicationScoped, @ManagedBean(eager=true)
- b.jar
- Module.class (@ApplicationScoped, @ManagedBean(eager=true)
我在两个类的 @PostConstruct 注释方法中放置了一个记录器,以确定首先调用哪个,在 JBossAS7 服务器上进行了几次部署之后,我注意到加载这些类似乎没有特定的顺序。我的意图是总是在 Module.class 之前加载 Registry.class。但是对于这个类加载行为,我不知道如何实现它。
在某些情况下,首先加载 Registry.class,但在其他情况下,即使我刚刚重新启动应用程序服务器并且没有更改代码
,Module.class 也会首先加载。
现在我的问题是,我可以做些什么来定义在 WEB-INF/lib 中加载 jar 的顺序吗?
不同的视角:
问题是否也可能不在类加载中,而是与 ApplicationScoped 急切的 ManagedBean 相关?我在 a.jar 上添加了一个类:
- RegistryTwo.class (@ApplicationScoped, @ManagedBean(eager=true)
这样a.jar现在包含Registry.class 和RegistryTwo.class。有了这个,我期待这样的事情:
(所需的输出)
Registry.class is invoked.
RegistryTwo.class is invoked.
Module.class is invoked.
或(我有这个问题。)
Module.class is invoked.
Registry.class is invoked.
RegistryTwo.class is invoked.
但在某些情况下,我得到这个:
RegistryTwo.class is invoked.
Module.class is invoked.
... (Other Processing logs.)
Registry.class is invoked.
根据@BalusC,ApplicationScoped Eager ManagedBean 将在应用程序启动时自动实例化( 如何强制应用程序范围的 bean 在应用程序启动时实例化?),这发生在我的代码中。
我只是好奇:
- JSF 如何加载/创建 ApplicationScoped Eager ManagedBeans?是否有某种规则可以定义/可以定义顺序?
- 当 RegistryTwo.class 都在同一个 jar 文件下并且它们都是 ApplicationScoped 时,为什么 Registry.class 没有在 RegistryTwo.class 之前/之后实例化?