- 스프링빈의 라이프사이클
- 객체생성 -> 의존관계 주입
- 생성자 주입의 경우는 예외!! -> 객체만들 때 이미 스프링빈이 파라미터에 같이 들어가야함
- 스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비완료됨.
- 따라서 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 한다.
- 초기화란? 객체가 외부랑 진짜 연결해야할 때(처음 제대로 일 시작할 때)
- 의존관계 주입이 완료되면, 스프링빈에게 콜백 메서드를 통해 초기화시점 알려줌
객체의 생성과 초기화를 분리하자.
- 최대한 생성자에서 다 해버리면 되는거 아닌가?(networkClient()에서 다 하면 안되나?) 파라미터 넘기고, 다 생성자 주입 시키면 안되는것?
-> 객체 생성과 초기화 분리필요!
-> 객체생성시에는 값 세팅정도만! 초기화는 외부연결과같은 무거운 일들!
public class NetworkClient implements InitializingBean, DisposableBean {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
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();
}
}
@Configuration
static class LifeCycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient(); // 아직 url정보 안들어옴
networkClient.setUrl("http://naver.dev");
return networkClient;
}
}
}
public void init(){
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
// 스프링의존관계 끝나고 호출해줌
}
public void close() {
System.out.println("NetworkClient.close");
disconnect();
}
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, 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() {
connect();
call("초기화 연결 메세지");
}
@PreDestroy
public void close() {
disconnect();
}
}
@PostConstruct
public void init(){
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
// 스프링의존관계 끝나고 호출해줌
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disconnect();
}