Spring Bean에 대하여 - 1
- Spring 에서 자주 이야기하고 사용하고 있는
@Bean
에 대해서 알아보자. - 설정하는 법, Lifecycle, Scope 등을 알아보자
Bean에 대해서
- Spring IoC 컨테이너가 인스턴스화, 관리, 생성하는 자바 객체
Bean 설정하는 법
대상자를 알아서 등록하는 법 : Component Scan
org.springframework.context.annotation.@ComponentScan
을 사용하여 특정package
나class
를 지정하여 Bean을 등록할 수 있다.- backPackage 를 따로 지정 안할 경우 Main Bootstrap Class 하위로 스캔한다.
직접 등록하는 법
@Bean
을 선언하여 사용
java Config
@Bean
public TempBean tempBean() {
return new TempBean();
}
xml
<bean id="..." class="...">
<property name="" value=""/>
</bean>
Bean Scope
- singleton(default로 사용), prototype
java Source로 이해하기
- TempBean 이라는 Class 를 만들고 두가지 Scope의 Bean 을 생성하자.
TempBean
@Slf4j
public class TempBean implements InitializingBean, DisposableBean {
public TempBean() {
log.info("TempBean 생성자 호출!");
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("afterPropertiesSet");
}
@Override
public void destroy() throws Exception {
log.info("destroy");
}
}
Bean 선언하기
@Configuration
public class Config {
@Bean("tempBean1")
public TempBean tempBean1() {
return new TempBean();
}
@Bean("tempBean3")
@Scope("prototype")
public TempBean tempBean3() {
return new TempBean();
}
}
실행하기
@Slf4j
public class Application implements CommandLineRunner {
@Autowired
private ApplicationContext applicationContext;
@Override
public void run(String... args) throws Exception {
TempBean tempBean1 = applicationContext.getBean("tempBean1", TempBean.class);
TempBean tempBean2 = applicationContext.getBean("tempBean1", TempBean.class);
log.info("singleton Bean : {}", tempBean1 == tempBean2);
TempBean tempBean3 = applicationContext.getBean("tempBean3", TempBean.class);
TempBean tempBean4 = applicationContext.getBean("tempBean3", TempBean.class);
log.info("prototype Bean : {}", tempBean3 == tempBean4);
}
}
결과보기
- singleton 으로 선언할 경우 같은 인스턴스로 나오지만
prototype
으로 선언할 경우 매번 새로운 객체가 생성된다. - 로그보기
TempBean 생성자 호출!
afterPropertiesSet
singleton Bean : true
TempBean 생성자 호출!
afterPropertiesSet
TempBean 생성자 호출!
afterPropertiesSet
prototype Bean : false
Bean life cycle
Java source
@Slf4j
public class BeanLifeCycle implements InitializingBean, DisposableBean {
public BeanLifeCycle() {
log.info("BeanLifeCycle 생성자 호출!");
}
@PostConstruct
public void postConstruct() {
log.info("postConstruct");
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("afterPropertiesSet");
}
public void initMethod() {
log.info("initMethod");
}
@Override
public void destroy() throws Exception {
log.info("destroy");
}
@PreDestroy
public void preDestroy() {
log.info("preDestroy");
}
public void destroyMethod() {
log.info("destroyMethod");
}
}
결과보기
BeanLifeCycle : BeanLifeCycle 생성자 호출!
BeanLifeCycle : postConstruct
BeanLifeCycle : afterPropertiesSet
BeanLifeCycle : initMethod
BeanLifeCycle : preDestroy
BeanLifeCycle : destroy
BeanLifeCycle : destroyMethod