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;
}
}
'Spring' 카테고리의 다른 글
[Spring] 예제로 보는 Classpath Scanning and Managed Components (0) | 2020.05.18 |
---|---|
[Spring] 예제로 보는 Annotation-based Container Configuration (0) | 2020.05.12 |
[Spring] 예제로 보는 Bean Scope (Feat. 동일성, 동등성) (0) | 2020.04.29 |
[Spring] 예제로 공부하는 IoC - Dependecies (제어의 역전 - 의존성) (0) | 2020.04.19 |
[스프링부트와 AWS로 혼자 구현하는 웹 서비스] PostsUpdateRequestDto 오류 (0) | 2020.03.25 |