2

我的 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 在应用程序启动时实例化?),这发生在我的代码中。

我只是好奇:

  1. JSF 如何加载/创建 ApplicationScoped Eager ManagedBeans?是否有某种规则可以定义/可以定义顺序?
  2. 当 RegistryTwo.class 都在同一个 jar 文件下并且它们都是 ApplicationScoped 时,为什么 Registry.class 没有在 RegistryTwo.class 之前/之后实例化?
4

1 回答 1

0

绝对没有排序规则。

我建议让Registry实施ServletContextListenerServletContainerInitializer代替。两者都保证在 JSF 应用程序范围的 bean 构造之前运行。

在 的情况下ServletContextListener,您可以Registry将自己置于应用程序范围内,如下所示:

@Override
public void contextInitialized(ServletContextEvent event) {
    event.getServletContext().setAttribute("registry", this);
}

它将以通常的方式在 JSF/EL 中可用#{registry}

于 2011-11-14T11:56:53.437 回答