Spring 3.0 (54) 드디어 등장한 ConfigurationClassApplicationContext
Spring JavaConfig이 @Configuration애노테이션으로 변신해서 Spring에 통합된 후에 가장 아쉬웠던 것은 JavaConfig에서는 가능했던 전용 ApplicationContext이 존재하지 않는다는 점이었다. @Configuration이 적용된 자바 클래스 설정만을 사용할 수 있는 간단한 방법이 없었다.
그래서 이런 저런 방법을 이용해서 @Configuration 설정만을 가진 ApplicationContext를 만들어보는 시도도 해봤다.
하지만 이제는 그런 복잡한 방법을 거치지 않고 단독으로 @Configuration 설정만을 사용하는 ApplicationContext를 만들 수 있다. RC2에 추가된 ConfigurationClassApplicationContext를 이용하면 된다.
아래와 같이 자바 클래스로 된 스프링 설정 정보가 있다고 하면,
@Configuration
static class Config {
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.name = "foo";
return testBean;
}
}
이를 사용하는 컨텍스트는 다음과 같이 만들면 된다.
ConfigurationClassApplicationContext ctx = new ConfigurationClassApplicationContext(Config.class);
생성자에는 하나 이상의 @Configuration 클래스를 사용할 수 있다.
또 다음과 같이 설정을 추가할 수도 있다.
ctx.addConfigurationClass(ConfigWithCustomName.class);
@Configuration을 이용한 설정의 특징은 설정정보를 담은 @Configuration 오브젝트 자체가 빈으로도 등록된다는 점이다. 그렇다면 빈 이름은 어떻게 될까? 사실 알 이유는 없다. 빈의 이름을 지정하도록 만들지 않은 것을 봐도 알 수 있듯이, 컨텍스트 설정 이후에 이 @Configuration 빈을 다시 가져다 사용할 필요는 없다. 그래도 호기심에 한번 읽어보고 싶다면 설정용 클래스의 이름을 이용하면 된다. 내부적으로는 BeanDefinitionReaderUtils.BeanDefinitionReaderUtils() 메소드를 이용해서 빈의 이름을 자동으로 생성한다.
그렇다면 @Configuration 방식의 컨텍스트만을 가진 애플리케이션을 만들 수 있을까? 만들고자하면 안될 이유는 없겠지만 별로 장점이 없다. 다만 계층형 구조로 컨텍스트를 구성하는 경우에 한 계층은 ConfigurationClassApplicationContext를 사용할 수 있을 것이다. 취향대로 쓰면 될 듯. 웹용으로 사용할 수 있도록 만든 ConfigurationClassWebApplicationContext도 있다.