1. ホーム
  2. java

[解決済み] Spring ApplicationContext - リソースリーク: 'context' が閉じられない

2022-02-26 10:45:58

質問

Spring MVCアプリケーションで、私は次のアプローチを使ってサービスクラスの1つの変数を初期化します。

ApplicationContext context = 
         new ClassPathXmlApplicationContext("META-INF/userLibrary.xml");
service = context.getBean(UserLibrary.class);

UserLibraryは、私のアプリケーションで使用しているサードパーティのユーティリティです。上記のコードでは、変数 'context' に対して警告が発生します。その警告を以下に示します。

Resource leak: 'context' is never closed

警告がよくわからないのですが。アプリケーションはSpring MVCアプリケーションなので、アプリケーションの実行中にサービスを参照するため、コンテキストを閉じる/破棄することはできません。この警告は一体何を伝えようとしているのでしょうか?

どうすればいいですか?

アプリのコンテキストは ResourceLoader (すなわち I/O 操作) は、ある時点で解放される必要のあるリソースを消費します。また、これは AbstractApplicationContext を実装している Closable . したがって、それは close() メソッドで使用することができ try-with-resourcesステートメント .

try (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/userLibrary.xml")) {
  service = context.getBean(UserLibrary.class);
}

このコンテキストを実際に作成する必要があるかどうかは別の問題です(あなたはそれにリンクしています)、私はそれについてコメントするつもりはありません。

確かにアプリケーションを停止すると暗黙のうちにコンテキストが閉じられますが、それではダメなんです。Eclipseの言う通り、クラスローダーのリークを避けるために、他のケースでは手動で閉じるような措置を取る必要があります。