jboss-as 7在使用ApplicationScoped eager ManagedBean的战争中加载

时间:2011-11-14 02:44:41

标签: jsf classloader managed-bean jboss7.x

我的Maven项目中有这种结构:

WEB-INF/lib
  - a.jar
       - Registry.class (@ApplicationScoped, @ManagedBean(eager=true)
  - b.jar
       - Module.class (@ApplicationScoped, @ManagedBean(eager=true)


我在两个类的@PostConstruct注释方法上放置了一个记录器,以确定首先调用哪个,在JBossAS7服务器上进行多次部署之后,我注意到 SEEMS在加载时没有特定的顺序这些类。我的目的是总是在Module.class之前加载Registry.class。但是有了这个类加载行为,我不知道如何实现它。

在某些情况下,首先加载Registry.class,但在其他情况下,即使我刚刚重新启动应用程序服务器并且没有对代码进行任何更改,Module.class也会先加载

现在我的问题是,我可以做些什么来定义在WEB-INF / lib中加载jar的顺序吗?


不同的观点:

问题是否也可能不在类加载中,而是使用ApplicationScoped eager 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渴望的ManagedBean将在应用程序启动时自动实例化( How do I force an application-scoped bean to instantiate at application startup?)这种情况发生在我的代码中。

我只是想知道:

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

1 个答案:

答案 0 :(得分:0)

绝对没有订购规则。

我建议让Registry实施ServletContextListenerServletContainerInitializer。两者都保证在JSF应用程序作用域bean构造之前运行。

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

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

通过#{registry}通常的方式在JSF / EL中可用。