2

私の Maven プロジェクトには、このような構造があります。

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


どちらが最初に呼び出されるかを判断するために、2 つのクラスの @PostConstruct アノテーション付きメソッドにロガーを配置し、JBossAS7 サーバーに何度かデプロイした後、これらのクラスをロードする際に特定の順序がないように見えることに気付きました。私の意図は、常に Module.class の前に Registry.class をロードすることです。しかし、このクラスの読み込み動作では、それを達成する方法がわかりません。

場合によっては、Registry.class が最初にロードされますが、アプリケーション サーバーを再起動したばかりでコードに変更を加えていない場合でも、Module.class が最初にロードされる場合があります。

私の質問は、WEB-INF/lib 内で jar をロードする順序を定義するためにできることはありますか?


別の視点:

問題がクラスのロード内にあるのではなく、ApplicationScoped の熱心な 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 は、アプリケーションの起動時に自動インスタンス化されます ( アプリケーション スコープの Bean を強制的にアプリケーションの起動時にインスタンス化するにはどうすればよいですか? )。

私はただ疑問に思います:

  1. JSF はどのように ApplicationScoped の熱心な ManagedBeans をロード/作成しますか? 順序を定義できる/定義できる規則はありますか?
  2. RegistryTwo.class の両方が同じ jar ファイルの下にあり、両方とも ApplicationScoped である場合、Registry.class が RegistryTwo.class の前/直後にインスタンス化されなかったのはなぜですか?
4

1 に答える 1

0

順序規則はまったくありません。

Registry代わりに実装ServletContextListenerすることをお勧めしServletContainerInitializerます。どちらも、JSF アプリケーション スコープの Bean 構築の前に実行されることが保証されています。

の場合、次のように自分自身をアプリケーション スコープに入れるServletContextListenerことができます。Registry

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

JSF/EL で通常の方法で利用できるようになります#{registry}

于 2011-11-14T11:56:53.437 に答える