Spring

[Spring] 예제로 보는 Ioc Container - Customizing the Nature of a Bean

KEMON 2020. 4. 30. 15:55
728x90

1. Initialization Callbacks 

 org.springframework.beans.factory.InitializingBean 인터페이스는 Container가 Bean을 설정하고 Bean을 초기화 할 수 있는 작업을 도와준다.

@Getter
@Slf4j
@AllArgsConstructor
public class ConnectionFactory implements InitializingBean {
    private String driverClass;
    private String url;
    private String user;
    private String password;
    private Connection connection;


    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("init");
    }
}

위의 코드와 같이 InitializingBean를 구현하고 afterPropertiesSet를 Override하여

Bean이 생성될 때에 원하는 코드를 작성할 수 있다.

 

※ 다만 코드의 혼잡성 때문에 위와 같은 방법은 추천하지 않는다. 

 <bean id="connectionFactory" class="kr.co.fastcampus.cli.ConnectionFactory" init-method="init"/>

따라서 xml에서 bean을 설정할때 init-method="함수명" 옵션을 주고 아래와 같이 코드를 바꿀 수 있다.

@Getter
@Slf4j
@AllArgsConstructor
public class ConnectionFactory {
    private String driverClass;
    private String url;
    private String user;
    private String password;
    private Connection connection;


    @Override
    public void init() throws Exception {
        log.info("init");
    }
}

 

2. Destruction Callbacks

org.springframework.beans.factory.DisposableBean 인터페이스는 Bean Container가 파괴될 때 Bean이 콜백받도록 해준다.



@Getter
@Slf4j
public class ConnectionFactory implements DisposableBean {
    private String driverClass;
    private String url;
    private String user;
    private String password;
    private Connection connection;

    @Override
    public void destroy() throws Exception {
        log.info("destroy");
    }

}

위의 코드와 같이 DisposableBean 구현하고 destroy를 Override하여

Bean이 파괴될 때에 원하는 코드를 작성할 수 있다.

 

※ 다만 코드의 혼잡성 때문에 위와 같은 방법은 추천하지 않는다. 

 <bean id="connectionFactory" class="kr.co.fastcampus.cli.ConnectionFactory" destroy-method="destroy"/>

따라서 xml에서 bean을 설정할때 destroy-method="함수명" 옵션을 주고 아래와 같이 코드를 바꿀 수 있다.

@Getter
@Slf4j
public class ConnectionFactory {
    private String driverClass;
    private String url;
    private String user;
    private String password;
    private Connection connection;

    
    public void destroy() throws Exception {
        log.info("destroy");
    }

}

 

※ xml설정을 bean마다 하는게 싫고 공통으로 쓰고싶다면 아래처럼 Beans에 default 옵션을 넣을 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<beans default-init-method="init"
       default-destroy-method="destroy">


    <bean id="connectionFactory" class="kr.co.fastcampus.cli.ConnectionFactory">
        <constructor-arg name="driverClass" value="org.h2.Driver" />
        <constructor-arg name="url" value="jdbc:h2:mem:test;MODE=MySQL;"/>
        <constructor-arg name="user" value=""/>
        <constructor-arg name="password" value=""/>

    </bean>
 
</beans>

 

3. Startup and Shutdown Callbacks 

Lifecycle 인터페이스는 고유 한 LifeCycle 요구 사항이있는 모든 개체 (예 : 백그라운드 프로세스 시작 및 중지)에 대한 필수 방법을 정의한다,

public interface Lifecycle {

    void start();

    void stop();

    boolean isRunning();
}

이중에서 isRunning()을 테스트 해보자.

@Slf4j
public class Main {

    public static void main(String[] args)  {

        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("dao.xml");
        Lifecycle lifecycle = context.getBean(Lifecycle.class);
        log.info(""+lifecycle.isRunning());   //결과 : true
        context.close();
        log.info(""+lifecycle.isRunning());   //결과 : false
    }
}

 

위의 코드를 보면 context.close() 이전 이후로 결과값(boolean)이 달라지는 것을 볼 수 있다.

※스프링 컨테이너가 살았는지 죽었는지 조건적으로 설정을 때에 라이프사이클 인터페이스 사용하면 편리하다.

(초보레벨에서는 사용할 거의 없다)

 

4.  ApplicationContextAware

특정 bean에서 applicationContext 사용할 경우 ApplicationContextAware 인터페이스를 implements하고 setApplicationContext 구현하면 된다.

@Slf4j
public class A implements ApplicationContextAware {

    private ApplicationContext applicationContext;
    
    public void init(){
        log.error("applicationContext::::"+applicationContext); 
        //결과 값: applicationContext값 
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

 

728x90