Загрузка класса jboss-as 7 в войне с помощью ApplicationScoped eager ManagedBean - PullRequest
2 голосов
/ 14 ноября 2011

У меня есть такая структура в моем проекте 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?


Другая точка зрения:

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

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

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

1 Ответ

0 голосов
/ 14 ноября 2011

Абсолютно нет правила упорядочения.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...