ApplicationContext가 스프링 컨테이너
스프링 컨테이너는 @Configuration이 붙은 DependencyConfig를 설정 정보로 사용
@Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록합니다.
직접 자바 코드로 설정 및 등록했던 것을 스프링 컨테이너에 객체만 스프링 빈으로 등록해주고 스프링 컨테이너에서 찾아서 사용하도록 변경된 것입니다.
@Configuration
해당 애너테이션에는 @Component가 적용되어있기 때문에 ComponentScan할 때 자동으로 스프링 빈 등록이 됩니다.
만약 이전 설정 파일 (DependencyConfig 등)에 @Configuration 애너테이션이 붙어있으면 @Configurationr이 설정된 파일 자체를 제거하거나 전체 주석 처리를 해야합니다.
이전 설정 파일(@Configuration이 적용된)을 놔두고 싶다면 ComponentScan의 Filter를 사용할 수도 있습니다.
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class))을 추가해줘야합니다.
@Autowired
AnntationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해서 AppConfig.class를 읽고 BeanDefinition을 생성합니다.
BeanDefintion 메타정보 확인하기
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class BeanDefinitionTest { public static void main(String[] args) { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(DependencyConfig.class); String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName); if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) { System.out.println("beanDefinitionName = " + beanDefinitionName + ", beanDefinition = " + beanDefinition); } } } }
BeanDefinition 정보에는 BeanClassName, Scope, lazyInit 등등 다양한 정보들을 가지고 있습니다.
스프링 컨테이너에 AnnotationConfigApplicationContext를 통해 DependencyConfig.class로 스프링 빈을 등록하면 BeanDefintion을 생성하고 그 안에 다양한 메타 정보들을 갖고 있다.