【发布时间】:2011-12-28 08:09:32
【问题描述】:
我的 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 将在应用程序启动时自动实例化( How do I force an application-scoped bean to instantiate at application startup?) 这发生在我的代码中。
我只是想知道:
- JSF 如何加载/创建 ApplicationScoped Eager ManagedBeans?是否有某种规则可以定义/可以定义顺序?
- 当 RegistryTwo.class 都在同一个 jar 文件下并且都是 ApplicationScoped 时,为什么没有在 RegistryTwo.class 之前/之后实例化它们?
【问题讨论】:
标签: jsf classloader managed-bean jboss7.x