我的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?)这种情况发生在我的代码中。
我只是想知道:
答案 0 :(得分:0)
绝对没有订购规则。
我建议让Registry
实施ServletContextListener
或ServletContainerInitializer
。两者都保证在JSF应用程序作用域bean构造之前运行。
如果是ServletContextListener
,您可以让Registry
将自己置于应用范围内,如下所示:
@Override
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("registry", this);
}
通过#{registry}
通常的方式在JSF / EL中可用。