2018-8-30 Bean LiftCycle

빈 라이프사이클

스프링컨테이너는 초기화와 종료라는 라이프 사이클을 가진다.

  • 컨테이너를 사용한다는 것은 getBean()과 같은 메서드를 이용해서 컨테이너에 보관된 빈객체를 구하는 것이다.
  • 컨테이너초기화 : 빈객체의 생성과 의존 객체 주입 및 초기화
  • 컨테이너종료 : 빈객체의 소멸

public class Client implements InitializingBean, DisposableBean {
    private String host;

    public void setHost(String host) {
        this.host = host;
        System.out.println("Client.setHost 실행");
    }

    @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() 실행");
    }
}
//result
Client.setHost 실행
Client.afterPropertiesSet() 실행
Client.send() to서버
Client.destroy() 실행
  • 스프링컨테이너는 빈객체의 프포퍼티 설정을 마무리한 뒤에 초기화 메서드를 실행을 한다.
  • destory()메서드의 경우 ctx.close()가 없으면 스프링 컨테이너의 종료 과정을 수행하지 않기 때문에, 빈객체의 소멸도 이루어지지 않는다.

객체범위

public class Main {
    public static void main(String[] args) {
        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:appCtx.xml");
        Client client = ctx.getBean("client", Client.class);
        Client client2 = ctx.getBean("client", Client.class);
        System.out.println("client == client2 : " + client.equals(client2));
        ctx.close();
    }
}
//result
client == client2 : true
  • 한 식별자에 대해 한 개의 객체만 존재하는 빈을 싱글톤(Singleton)라고 한다.
  • 빈의 범위를 따로 프로토타입으로 지정을 해서, 빈 객체를 구할 때 마다 매번 새로운 객체를 생성할 수도 있다.
  • @Scoe어노테이션이나 bean태그의 scope=”prototype”으로 지정을 하면 매번 새로운 객체를 생성한다.

AOP

Written on August 30, 2018