スプリングアイドルライフサイクルコールバック
38884 ワード
空のライフサイクルコールバック?
データベース接続プールやネットワークソケットなどのアプリケーションの開始時に必要な接続を事前に確立し、アプリケーションの終了時にすべての接続を終了するには、オブジェクトの初期化と終了が必要です.スプリングがこの過程をどのように処理しているかを理解しましょう.
スプリングシートのライフサイクル
スプリングシートには、次のライフサイクルがあります.
スプリングシートには、次のライフサイクルがあります.
初期化の時点を示すスプリング空コールバック方法。
依存関係注入が完了すると、Springは様々な機能を提供し、SpringBinがいつ初期化されるかをコールバック法で通知することができる.また,初期化時間を教えるように,スプリング容器が終了する前に消滅コールバックを与える.従って、これらの機能により安全に動作することができる.
スプリングシート内のイベントライフサイクル
Springbinのイベントには次のライフサイクルがあります.
スプリングアイドルライフサイクルコールバックをサポート
Springには、空のライフサイクルコールバックをサポートする3つの方法があります.
1.インタフェース初期化bean、DisposableBean
InitializingBean
サポートafterPropertiesSet()
メソッドを初期化します.DisposableBean
サポートdestroy()
メソッド破棄.インタフェースサンプルコードNetworkClient
package hello.core.lifecycle;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class NetworkClient implements InitializingBean, DisposableBean {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
connect();
call("초기화 연결 메시지");
}
public void setUrl(String url) {
this.url = url;
}
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message : " + message);
}
public void disconnect() {
System.out.println("close: " + url);
}
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("초기화 연결 메시지");
}
@Override
public void destroy() throws Exception {
disconnect();
}
}
インタフェースサンプルコードNetworkClientTest
package hello.core.lifecycle;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
class NetworkClientTest {
@Test
void lifeCycleTest() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
ac.getBean(NetworkClient.class);
ac.close();
}
@Configuration
static class LifeCycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.org");
return networkClient;
}
}
}
インタフェースサンプルコード結果
생성자 호출, url = null
connect: null
call: null message : 초기화 연결 메시지
NetworkClient.init
connect: http://hello-spring.org
call: http://hello-spring.org message : 초기화 연결 메시지
16:53:52.566 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@446293d, started on Fri May 21 16:53:52 KST 2021
NetworkClient.close
close: http://hello-spring.org
その結果,初期化方法は注入完了後に呼び出され,スプリング容器の終了が呼び出されると破棄方法が呼び出されたと判断できることが分かった.初期化によるインタフェースの欠点の解消
2.設定情報を初期化し、終了方法を指定する
この方法は、
@Bean(initMethod = "init", destroyMethod = "close")
などの初期化、破棄方法を設定情報に指定することができる.情報サンプルコードNetworkClientの設定
package hello.core.lifecycle;
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
connect();
call("초기화 연결 메시지");
}
public void setUrl(String url) {
this.url = url;
}
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message : " + message);
}
public void disconnect() {
System.out.println("close: " + url);
}
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
public void close() {
System.out.println("NetworkClient.close");
disconnect();
}
}
情報サンプルコードNetworkClientTestの設定
package hello.core.lifecycle;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
class NetworkClientTest {
@Test
void lifeCycleTest() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
ac.getBean(NetworkClient.class);
ac.close();
}
@Configuration
static class LifeCycleConfig {
// @Bean(initMethod = "init", destroyMethod = "close")
@Bean(initMethod = "init")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.org");
return networkClient;
}
}
}
設定情報サンプルコード結果
생성자 호출, url = null
connect: null
call: null message : 초기화 연결 메시지
NetworkClient.init
connect: http://hello-spring.org
call: http://hello-spring.org message : 초기화 연결 메시지
17:02:02.819 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3059cbc, started on Fri May 21 17:02:02 KST 2021
NetworkClient.close
close: http://hello-spring.org
設定情報フィーチャーの使用
終了方法の推論
@Bean의 destroyMethod
属性は特殊な機能を有するclose
、shotdown
という名前の終了メソッドが使用されることが多い.destroyMethod
デフォルトは推論close
、shotdown
の名前のメソッドを自動的に呼び出します.終了メソッドを名前で推定して呼び出します.3.@PostConstruct,@Predestory宣言
操作例コードNetwork Client
package hello.core.lifecycle;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
connect();
call("초기화 연결 메시지");
}
public void setUrl(String url) {
this.url = url;
}
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message : " + message);
}
public void disconnect() {
System.out.println("close: " + url);
}
@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disconnect();
}
}
識別サンプルコードNetworkClientTest
package hello.core.lifecycle;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
class NetworkClientTest {
@Test
void lifeCycleTest() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
ac.getBean(NetworkClient.class);
ac.close();
}
@Configuration
static class LifeCycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.org");
return networkClient;
}
}
}
構文サンプルコードの結果
생성자 호출, url = null
connect: null
call: null message : 초기화 연결 메시지
NetworkClient.init
connect: http://hello-spring.org
call: http://hello-spring.org message : 초기화 연결 메시지
17:09:03.740 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3059cbc, started on Fri May 21 17:09:03 KST 2021
NetworkClient.close
close: http://hello-spring.org
技術的特徴
リファレンス
READ
2021.05.21-最初のコンテンツの作成
Reference
この問題について(スプリングアイドルライフサイクルコールバック), 我々は、より多くの情報をここで見つけました
https://velog.io/@jaepani5015/스프링-빈-생명주기-콜백
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(スプリングアイドルライフサイクルコールバック), 我々は、より多くの情報をここで見つけました https://velog.io/@jaepani5015/스프링-빈-생명주기-콜백テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol