스프링이 컴포넌트 스캔을 할 때 클래스로딩을 하지 않는다는 증거
참조: InsideSpring (4) 빈 스캐너는 클래스를 로딩할까?
사부님의 주옥같은 글을 보다가.. 마지막 쯤에 클래스로딩이 되는지 안되는지 쉽게 확인한 방법이 안 떠오르신다고 해서;; 순간 생각난 원초적인 방법으로 실험해 봤습니다.
@Component
@Scope(value = "prototype")
public class Bean {
static {
System.out.println("I am loaded!");
}
}
초간단 빈을 하나 만들고, 클래스가 로딩 될 때 실행되도록 static 블럭에 메시지를 출력합니다. 빈 스코프가 중요한데, 기본 스코프(singletone)이면 ApplicationContext를 만들 때 미리 인스턴스를 만들어 버리기 때문에, 만들다가 저 클래스를 로딩 하게되죠. 대충 로깅 메시지를 보고서 이미 컴포넌트 스캔이 끝난 뒤에 만들겠거니... 짐작할 수는 있지만 더 명시적으로 확인할 수 있게 애초에 prototype 스코프로 만듭니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ClassLoadingTest {
@Autowired ApplicationContext ac;
@Test
public void asm(){
assertThat(ac, is(notNullValue()));
for(String beanName : ac.getBeanDefinitionNames()){
System.out.println(beanName);
}
}
}
그리고 초간단 테스트! 와 빈설정은.. 같은 패키지에 ClassLoadingTest-context.xml 이라는 이름으로
<context:component-scan base-package="sandbox.asm" />
이렇게 달랑 한줄.
결과는..
반대로.. 리플렉션을 이용하면 어떻게 되는지 확인해봅니다.
역시;; 초간단 테스트 추가
@Test
public void reflection() throws ClassNotFoundException {
Class bean = Class.forName("sandbox.asm.Bean");
assertThat(bean, is(notNullValue()));
}
메시지 확인
캬캬캬.. 스프링은 역시 좀 짱이구나;