jboss-as 7 загрузка класса в войне с ApplicationScoped нетерпеливым ManagedBean

У меня есть такая структура в моем проекте Maven:

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


Я поместил регистратор в аннотированный метод @PostConstruct для двух классов, чтобы определить, какой из них вызывается первым, и после нескольких развертываний на сервере JBossAS7 я заметил, что КАЖЕТСЯ, нет определенного порядка загрузки эти классы. Я намерен ВСЕГДА загружать Registry.class перед Module.class. Но с таким поведением при загрузке класса я не знаю, как этого добиться.

В некоторых случаях Registry.class загружается первым, но в других случаях первым загружается Module.class, даже если я только что перезапустил сервер приложений и не внес никаких изменений в код.

Теперь мой вопрос: могу ли я что-то сделать, чтобы определить порядок загрузки jar-файлов в WEB-INF/lib?


Другой ракурс:

Может также быть возможно, что проблема не в загрузке класса, а в нетерпеливом ManagedBean ApplicationScoped? Я добавил класс в 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, ManagedBean ApplicationScoped будет автоматически создан при запуске приложения ( Как заставить bean-компонент в области приложения создавать экземпляр при запуске приложения?), и это происходит в моем коде.

Мне просто интересно:

  1. Как JSF загружает/создает нетерпеливые ManagedBeans ApplicationScoped? Есть ли какое-то правило, в котором порядок может быть определен?
  2. Почему экземпляр Registry.class не был создан до/сразу после RegistryTwo.class, когда они оба находятся в одном и том же файле jar и оба находятся в ApplicationScoped?

person inxis    schedule 14.11.2011    source источник


Ответы (1)


Абсолютно нет правил заказа.

Я предлагаю позволить Registry реализовать ServletContextListener или, возможно, ServletContainerInitializer вместо этого. Оба гарантированно будут запускаться до того, как будут созданы bean-компоненты JSF.

В случае ServletContextListener вы можете позволить Registry поместить себя в область приложения следующим образом:

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

Он будет доступен в JSF/EL обычным способом к #{registry}.

person BalusC    schedule 14.11.2011