私の 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 を強制的にアプリケーションの起動時にインスタンス化するにはどうすればよいですか? )。
私はただ疑問に思います:
- JSF はどのように ApplicationScoped の熱心な ManagedBeans をロード/作成しますか? 順序を定義できる/定義できる規則はありますか?
- RegistryTwo.class の両方が同じ jar ファイルの下にあり、両方とも ApplicationScoped である場合、Registry.class が RegistryTwo.class の前/直後にインスタンス化されなかったのはなぜですか?