Springの@PostConstructと@PreDestroy

Spring Beansを依存性注入を使って設定する際には、クライアントのリクエストを処理する前にすべてが適切に初期化されることを確認したい場合があります。同様に、コンテキストが破棄される際には、Spring Beanが使用しているいくつかのリソースを閉じる必要があるかもしれません。

春の@PostConstruct

Spring Beanのメソッドに@PostConstructアノテーションを付けると、そのメソッドはSpring Beanの初期化後に実行されます。@PostConstructアノテーションは1つのメソッドにしか付けることができません。このアノテーションはCommon Annotations APIの一部であり、JDKモジュールjavax.annotation-apiの一部です。したがって、Java 9以降でこのアノテーションを使用する場合は、明示的にこのjarをプロジェクトに追加する必要があります。Mavenを使用している場合、以下の依存関係を追加する必要があります。

<dependency>
	<groupId>javax.annotation</groupId>
	<artifactId>javax.annotation-api</artifactId>
	<version>1.3.2</version>
</dependency>

もしJava 8またはそれ以前のバージョンを使用している場合は、上記の依存関係を追加する必要はありません。

春の @PreDestroy

Spring BeanのメソッドにPreDestroyアノテーションを付けると、そのBeanインスタンスがコンテキストから削除される際に呼び出されます。これは非常に重要なポイントであり、Spring Beanのスコープが「prototype」である場合、完全にSpringコンテナによって管理されず、PreDestroyメソッドは呼び出されません。shutdownまたはcloseという名前のメソッドがある場合、SpringコンテナはBeanが破棄される際に自動的にコールバックメソッドとして構成を試みます。

スプリングの@PostConstructと@PreDestroyの例

以下は、@PostConstructと@PreDestroyメソッドがあるシンプルなスプリングビーンです。

package com.scdev.spring;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class MyBean {

	public MyBean() {
		System.out.println("MyBean instance created");
	}

	@PostConstruct
	private void init() {
		System.out.println("Verifying Resources");
	}

	@PreDestroy
	private void shutdown() {
		System.out.println("Shutdown All Resources");
	}

	public void close() {
		System.out.println("Closing All Resources");
	}
}

私はまた、私たちのビーンが破棄されるときに呼び出されるかどうかを確認するために、closeメソッドを定義していることに注意してください。以下は私のシンプルなSpring構成クラスです。

package com.scdev.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyConfiguration {
	
    @Bean
    @Scope(value="singleton")
    public MyBean myBean() {
	return new MyBean();
    }
	
}

私は明示的に私のビーンをシングルトンとして指定する必要はありませんが、後でその値を「プロトタイプ」に変更して@PostConstructと@PreDestroyメソッドで何が起こるかを見てみます。ここに私のメインクラスがあります。そこで私はSpringコンテキストを作成し、MyBeanのいくつかのインスタンスを取得しています。

package com.scdev.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MySpringApp {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
		ctx.register(MyConfiguration.class);
		ctx.refresh();

		MyBean mb1 = ctx.getBean(MyBean.class);
		System.out.println(mb1.hashCode());

		MyBean mb2 = ctx.getBean(MyBean.class);
		System.out.println(mb2.hashCode());

		ctx.close();
	}

}

上記のクラスを実行すると、以下の出力が得られます。

MyBean instance created
Verifying Resources
1640296160
1640296160
Shutdown All Resources
Closing All Resources

@PostConstructメソッドは、ビーンのインスタンス化後に呼び出されます。コンテキストが閉じられる際には、シャットダウンメソッドとクローズメソッドの両方が呼び出されます。

プロトタイプスコープでのSpringの@PostConstructと@PreDestroyの使用

MyConfigurationのスコープ値をプロトタイプに変更し、メインクラスを実行してください。以下のような出力が得られます。

MyBean instance created
Verifying Resources
1640296160
MyBean instance created
Verifying Resources
1863374262

春のコンテナは明らかに、各リクエストでビーンを初期化し、その後、@PostConstructメソッドを呼び出してクライアントに渡しています。その後、Springはビーンの管理を行っていません。この場合、クライアントはPreDestroyメソッドを直接呼び出して、すべてのリソースのクリーンアップを行わなければなりません。

要約

@PostConstructと@PreDestroyは、Springビーンのライフサイクル管理に使用する重要なアノテーションです。これらを使用して、ビーンが正しく初期化されたことを検証し、ビーンがSpringコンテキストから削除される際にはすべてのリソースを適切に閉じることができます。

弊社のGitHubリポジトリから、プロジェクトの完全なコードをご確認いただけます。

コメントを残す 0

Your email address will not be published. Required fields are marked *