[스프링 3.0] 스프링 bean과 일반 자바 객체가 호출하는 @Bean 메서드의 차이
public class JavaConfigTest {
AnnotationConfigApplicationContext ac;
@Before
public void setUp(){
ac = new AnnotationConfigApplicationContext(AppConfig.class);
assertThat(ac, is(notNullValue()));
}
@Test
public void getBean(){
SampleBean bean1 = ac.getBean("sampleBean", SampleBean.class);
SampleBean bean2 = ac.getBean("sampleBean", SampleBean.class);
assertThat(bean1, is(notNullValue()));
assertThat(bean2, is(notNullValue()));
assertThat(bean1, is(bean2));
AppConfig config1 = new AppConfig();
SampleBean bean3 = config1.sampleBean();
assertThat(bean3, is(not(bean2)));
AppConfig config2 = ac.getBean("appConfig", AppConfig.class);
SampleBean bean4 = config2.sampleBean();
assertThat(bean4, is(bean2));
}
}
스프링 3.0 애노테이션 기반 설정을 익히기 위해서 처음 만들어본 테스트입니다. 이 테스트에서 알 수 있는 건 바로 이 글의 제목에서처럼 @Bean이 붙어있는 메서드를 어떤 객체를 이용해서 호출하느냐에 따라 그 결과가 다를 수 있다는 겁니다.
@Configuration
public class AppConfig {
@Bean
public SampleBean sampleBean(){
return new SampleBean();
}
}
이건 설정한 빈이고 SampleBean은 뭐 암거나;; @_@;
결론은 new 로 만든 AppConfig와 스프링에서 가져온 AppConfig의 @Bean이 붙은 메서드가 반환해주는 값이다르다는 겁니다. 전자는 일반적인 Java 문맥대로 sampleBean()에서 new SampleBean()으로 새로운 객체를 만들어서 받은 것이고, 후자는 sampleBean() 메서드 호출을 가로채서 기존의 bean을 반환해준 겁니다.
이 경우는 매우 간단한 경우에 속합니다. 하나는 스프링이 관리하는 빈이었고, 하나는 일반 자바 객체였으니까요. 그런데 만약에 둘 다 스프링의 빈이라면? 그 중에 하나는 @Configuration, 다른 하나는 @Component라면?
@Component로 설정한 빈 내부에 위와 똑같은 설정이 들어있다면? 반환하는 객체의 값이 조금 다르나면??
빈 스캔은 어찌하나?
정말 복잡하군요;; 하나씩 차근 차근 해보겠습니다.