空きライフサイクルと範囲


空きライフサイクルと範囲


コンテナの初期化と終了


スプリングコンテナには、初期化と終了のライフサイクルがあります.
// 컨테이너 초기화
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);

// 컨테이너에서 빈 객체를 구해서 사용
Greeter g = ctx.getBean("greeter", Greeter.clas);
String msg = g.greet("스프링");
System.out.println(msg);

// 컨테이너 종료
ctx.close();
以上のコードは、AnnotationConfigApplicationContextのジェネレータを使用してコンテキストオブジェクトを作成し、Springコンテナを初期化します.スプリングコンテナは、設定クラスから情報を読み込み、適切な空のオブジェクトを作成し、各空のオブジェクトを接続します.
コンテナの初期化が完了したら、コンテナを使用できます.表示を使用してgetBeanなどの方法で空のオブジェクトを取得します.
コンテナの使用が完了し、コンテナを閉じます.close()メソッドは、AbstractApplicationContextクラスで定義されます.スプリングコンテナのライフサイクルに応じて、空のオブジェクトにも自然に生成され、消えたライフサイクルがあります.

スプリング空のオブジェクトのライフサイクル


スプリングコンテナは空のオブジェクトのライフサイクルを管理します.
객체 생성 - 의존 설정 - 초기화 - 소멸
スプリングコンテナを初期化すると、スプリングコンテナはまず空のオブジェクトを作成し、依存関係を設定します.依存を自動的に注入すると、依存設定が実行されます.すべての依存設定が完了すると、空のオブジェクトの初期化が実行されます.空のオブジェクトを初期化するには、スプリングが空のオブジェクトの指定方法を呼び出します.スプリングコンテナを閉じると、スプリングコンテナは空のオブジェクトの消失を処理します.指定したメソッドも呼び出されます.
  • Client.java
  • public class Client implements InitializingBean, DisposableBean {
    
    	private String host;
    
    	public void setHost(String host) {
    		this.host = host;
    	}
    
    	@Override
    	public void afterPropertiesSet() throws Exception {
    		System.out.println("Client.afterPropertiesSet() 실행");
    	}
    
    	public void send() {
    		System.out.println("Client.send() to " + host);
    	}
    
    	@Override
    	public void destroy() throws Exception {
    		System.out.println("Client.destroy() 실행");
    	}
    }
    空のオブジェクトがInitializationBeanインタフェースを実装する場合、スプリングコンテナは、初期化中に空のオブジェクトのafterProperties Set()メソッドを実行します.
    空のオブジェクトがDisposableBeanインタフェースを実装する場合、スプリングコンテナは破棄中に空のオブジェクトのdestroy()メソッドを実行します.
  • AppCtx.java
  • @Configuration
    public class AppCtx {
    
    	@Bean
    	public Client client() {
    		Client client = new Client();
    		client.setHost("host");
    		return client;
    	}
    }
    
    コンソールから出力されるメッセージの順序から、まずafterProperties Set()メソッドを実行します.すなわち、スプリングコンテナは、空のオブジェクトの作成が完了した後に初期化方法を実行する.最後にdestroy()メソッドを実行します.このメソッドは、スプリングコンテナを終了するときに呼び出されることがわかります.

    空のオブジェクトの初期化と消滅:カスタムメソッド


    直接実装されるクラスではなく、外部から提供されるクラスをスプリング空のオブジェクトに設定する場合があります.この場合、ソースコードが受信されていない場合、2つのインタフェースを実装するために変更することはできません.InitializingBean、Disposableインタフェースが実現できない場合、またはこの2つのインタフェースを使用したくない場合は、スプリング設定で直接方法を指定できます.
    メソッドは、@BeanタグでinitMethodプロパティとdestroyMethodプロパティを使用して、初期化メソッドと破棄メソッドの名前を指定します.
  • Client2.java
  • public class Client2 {
    
    	private String host;
    
    	public void setHost(String host) {
    		this.host = host;
    	}
    
    	public void connect() {
    		System.out.println("Client2.connect() 실행");
    	}
    
    	public void send() {
    		System.out.println("Client2.send() to " + host);
    	}
    
    	public void close() {
    		System.out.println("Client2.close() 실행");
    	}
    
    }
    初期化中にconnect()メソッドが必要で、破棄中にclose()メソッドが必要な場合は、@Beanで宣言されたinitMethod、destroyMethodプロパティで初期化および破棄中に使用するメソッド名を指定するだけです.
    	@Bean(initMethod = "connect", destroyMethod = "close")
    	public Client2 client2() {
    		Client2 client = new Client2();
    		client.setHost("host");
    		return client;
    	}

    空のオブジェクトの作成と管理範囲


    スプリングコンテナは空のオブジェクトを1つしか生成しないそうです.このような識別子の場合、単一の色調範囲を持つオブジェクトは1つしかありません.使用頻度は低いですが、プロトタイプ範囲の空を設定することもできます.
    空の範囲をプロトタイプとして指定すると、オブジェクトを空にするたびに新しいオブジェクトが生成されます.
    特定の空をプロトタイプ範囲として指定するには、prototypeの値を持つ@Scopeプレゼンテーションを@Beanプレゼンテーションとともに使用します.
    @Configuration
    public class AppCtxWithPrototype {
    
    	@Bean
    	@Scope("prototype")
            // @Scope("singleton") 가능
    	public Client client() {
    		Client client = new Client();
    		client.setHost("host");
    		return client;
    	}
    }
    プロトタイプ範囲を持つ空は、完全なライフサイクルに従わないことに注意してください.スプリングコンテナは、プロトタイプ内の空のオブジェクトを作成し、構成設定と初期化を実行しますが、コンテナが終了したときに作成されたプロトタイプ空のオブジェクトの非表示方法は実行されません.プロトタイプ範囲の空を使用する場合は、空のオブジェクトを直接非表示にする必要があります.