@Configuration
, @Component
두 어노테이션을 이용해서 컨테이너의 설정파일을 읽어들이고 컨테이너를 인스턴스화하는 데 필요한 ApplicationConfigApplicationContext 를 생성할 수 있다.
@Configuration
은 해당 클래스 자체를 @Bean
definition으로 등록되고, 안에 메서드 레벨에 선언된 모든 @Bean
에 대해서도 정의를 컨테이너에 등록하도록 한다.
@Component
는 스프링 컨테이너가 부트될 때 컴포넌트를 검색하여 정의된 빈들을 등록할 수 있도록 정보를 제공한다. @Repository
나 @Service
, @RestController
와 같은 어노테이션에는 @Component
가 기본적으로 포함되어 있다. 컨테이너가 의존성 주입을 위해 @Autowired
로 처리된 생성자, 필드 등을 통해 DI 메타 데이터를 구성하게 된다.
아래 예시를 보면 AppConfig.class
는 @Configuration
로 설정되어 클래스 및 클래스 내부에 선언된 @Bean
메서드들이 빈으로 설정된다. 기타 .class
파일들은 각 의존성을 지니고 있는 클래스를 @Autowired
로 표현하여 스프링 컨테이너에 빈 정의를 등록하도록 한다.
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();
}
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(MyServiceImpl.class, Dependency1.class, Dependency2.class);
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();
}
@Configuration
으로 빈 정의 설정하기