【问题标题】:jboss-as 7 class loading within a war with ApplicationScoped eager ManagedBeanjboss-as 7 类在与 ApplicationScoped eager ManagedBean 的战争中加载
【发布时间】: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?) 这发生在我的代码中。

我只是想知道:

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

【问题讨论】:

    标签: jsf classloader managed-bean jboss7.x


    【解决方案1】:

    绝对没有排序规则。

    我建议让Registry 实现ServletContextListener 或者ServletContainerInitializer。两者都保证在 JSF 应用程序范围的 bean 构造之前运行。

    如果是ServletContextListener,您可以让Registry 将自己置于应用范围内,如下所示:

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

    它将通过#{registry} 以通常的方式在 JSF/EL 中提供。

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2013-02-06
      • 2014-06-18
      • 1970-01-01
      • 2018-03-23
      相关资源
      最近更新 更多