Spring 컨테이너는 생성, 구성, 보관할 Bean에 대한 구성(configuration) 메타데이터가 필요하다. 이러한 메타데이터는 XML, Java 어노테이션, Java 코드 형식 중 하나로 작성할 수 있다.
여기서는 가장 많이 쓰이는 방식인 Java 코드 형식에 대해 알아보도록 한다.
@Configuration
컨테이너의 구성 정보를 포함하는 config 클래스에 단다. config 클래스의 주요 목적은 Bean에 대한 정의(definition)를 제공하는 것이다.
@Bean
config 클래스 안의 메서드에 단다. 해당 메서드는 컨테이너가 관리해야 하는 Bean을 생성, 구성, 초기화한다.
@Bean
이 달린 메서드가 @Bean
이 달린 다른 메서드를 호출하도록 하여 Bean 간의 의존 관계를 정의할 수 있다.@Configuration
class AppConfig {
@Bean
BeanExample beanExample() {
return new BeanExample();
}
...
}
ApplicationContext
인터페이스의 구현 클래스를 인스턴스화하여 컨테이너를 생성한다. 여기서는 AnnotationConfigApplicationContext
를 사용한다.
이 때 다음 중 하나의 방법을 사용하여 config 클래스를 컨테이너에 전달해야 한다.
config 클래스의 정보를 나타내는 Class
객체를 생성자에 전달한다.
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
BeanExample beanExample = context.getBean(BeanExample.class);
beanExample.doSomething();
register()
를 통해 동적으로 전달하기register(Class...)
를 호출하여 config 클래스의 Class
객체를 인자로 전달한다. 구성 정보를 모두 전달한 뒤 Bean을 사용하기 전 refresh()
를 호출해야 한다.
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext();
context.register(BeanExample.class);
context.refresh();
BeanExample beanExample = context.getBean(BeanExample.class);
beanExample.doSomething();
config 클래스에서 Bean을 정의하는 메서드에 @Bean
어노테이션을 달아야 한다. 정의된 Bean은 기본적으로 해당 메서드의 이름으로 등록된다.