스터디 발표 내용

스프링 라이프 사이클

비뀨_ 2021. 11. 11. 14:01

스프링은 빈(Bean)을 컨테이너에 등록을 시키고 난 후에 의존 관계를 주입시킨다. 

 

//1. 스프링 컨테이너 초기화
AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(AppCtx.class);
		
//2. 빈 객체를 컨테이너에서 구해서 사용.
Client client = ctx.getBean(Client.class);
client.send();
        
//3. 컨테이너 종료.
ctx.close();
더보기

1. AnnotationConfigApplicationContext 의 생성자로 AppCtx(컨텍스트) 객체 생성 &

    컨테이너는 설정 클래스에서 정보를 읽어와 빈 객체 생성 , 빈 연결작업.

2. 빈 객체를 구해서 사용

3. 컨테이너 소멸. AbstractApplicationContext에 있는 close 사용.

더보기

스프링 컨테이너 생성 빈 생성 , 의존 주입 , 초기화( InitializingBean )

→ 빈 객체 사용 → 종료전 콜백(DisposableBean) 스프링 종료

초기화와 소멸 전 콜백 함수는 어디서 써야 될까

대표적으로 DBCP (데이터베이스 커넥션 풀) 와 채팅에서 초기화와 소멸과정이 필요하다.

컨테이너를 이용하는 동안 연결을 생성하고 , 종료시 연결을 끊어야하기 때문이고,

채팅은 사용자가 서버와 연결을 생성하고 종료할 때 연결을 끊어야한다.

 

1. 초기화와 소멸 메서드를 상속

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() 실행");
	}

}

2. 직접 생성하고 싶을 때

//AppCtx.java
@Configuration
public class AppCtx {

	@Bean
	@Scope("prototype")
	public Client client() {
		Client client = new Client();
		client.setHost("host");
		return client;
	}
	//Bean 어노테이션에 initMethod 와 destroyMethod를 추가하고.
    //실행할 메서드의 이름을 적거나 Cilent.java의 Bean에 직접 추가.
	@Bean(initMethod = "connect", destroyMethod = "close")
	public Client client() {
		Client client = new Client2();
		client.setHost("host");
		return client;
	}
}

// Client.java

public class Client {

	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() 실행");
	}

}

빈 객체의 생성과 관리 범위

1. 빈 객체의 생성

스프링 컨테이너는 등록한 빈의 객체를 한개만 만든다고 했다.

이걸 싱글톤이라고 했는데 , 

%프로토 타입 %

 

2. 관리 범위 ( @Scope( "범위" ) )

사용 빈도 낮음.

빈 객체를 여러개 생성해야 될 때는 @Bean 어노테이션과 함께 @Scopre("prototype") 을 작성하면

객체를 여러개 생성 할 수 있다. 정도만 알고 넘어가기.