Jsf jboss作为7类在war中加载,与应用程序协同工作的ManagedBean

Jsf jboss作为7类在war中加载,与应用程序协同工作的ManagedBean,jsf,classloader,managed-bean,jboss7.x,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) - RegistryTwo.class (@ApplicationScoped, @ManagedBean(eager=

我在Maven项目中有这样的结构:

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

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

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

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


另一种观点:

问题是否也可能不在类加载中,而是在应用程序处理的ManagedBean中?我在a.jar上添加了一个类:

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

因此,a.jar现在包含Registry.class和RegistryTwo.class。有了这一点,我期待的是:

(期望输出)

或者(我对此会有问题。)


但在某些情况下,我得到的是:

RegistryTwo.class is invoked.
Module.class is invoked.

... (Other Processing logs.)

Registry.class is invoked.

根据@BalusC的说法,应用程序启动时,将自动实例化一个应用程序范围的ManagedBean( )这在我的代码中发生

我只是想知道:

  • JSF如何加载/创建应用程序处理的ManagedBeans?是否有某种规则可以定义顺序
  • 为什么Registry.class不在RegistryTwo.class之前/之后实例化,而它们都在同一个jar文件下,并且都是应用程序范围

  • 绝对没有排序规则

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

    ServletContextListener
    的情况下,您可以让
    Registry
    将其自身放入应用程序范围,如下所示:

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

    它将以JSF/EL的通常方式通过
    {registry}

    提供,绝对没有排序规则

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

    ServletContextListener
    的情况下,您可以让
    Registry
    将其自身放入应用程序范围,如下所示:

    @Override
    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("registry", this);
    }
    
    它将以JSF/EL的通常方式通过
    {registry}
    提供