S-JIS[2024-03-10] 変更履歴
JAX-RSのApplicationScopedアノテーションのメモ。
アプリケーション全体でひとつのインスタンスだけが共有されるオブジェクト(アプリケーション終了時に破棄されるオブジェクト)はApplicationScopedで作成できる。
ApplicationScopedを使うには、build.gradleのdependenciesに以下のライブラリーを指定する。
dependencies { compileOnly 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0' compileOnly 'jakarta.enterprise:jakarta.enterprise.cdi-api:4.0.1' }
import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped public class MyApplicationResource { @PostConstruct void construct() { // フィールドの初期化 } public void 操作() { 〜 } @PreDestroy void destroy() { // フィールドのオブジェクトのクローズ } }
クラスにApplicationScopedアノテーションを付ける。
このクラスでは、引数を持つコンストラクターを定義できないようだ。(コンストラクターインジェクションが出来ない)
必要に応じて、生成時に呼ばれるPostConstructや終了時に呼ばれるPreDestroyのメソッドを実装する。
なお、これらのメソッドではIOException等のチェック例外をスローすることは出来ないようだ。(throwsを宣言するとデプロイ時にエラーになる)
ApplicationScopedのオブジェクトを使う側は、インジェクトする。
import jakarta.inject.Inject;
@Path("/resource3") public class Resource3 { @Inject private MyApplicationResource myResource; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { myResource.操作(); return 〜; } }