ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
를 스프링 컨테이너하고 한다.ApplicationContext
는 인터페이스이다.AppConfig
를 사용했던 방식은 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다.ApplicationContext
) 만들기new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
인터페이스의 구현체이다.스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다.
빈 이름은 항상 다른 이름을 부여해야한다.
스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)한다.
스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있다.
그런데, 이렇게 자바 코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한 번에 처리된다.
ac.getBeanDefinitionNames()
: 스프링에 등록된 모든 빈 이름을 조회한다.ac.getBean()
: 빈 이름으로 빈 객체(인스턴스)를 조회한다.getRole()
로 구분할 수 있다.ROLE_APPLICATION
: 직접 등록한 애플리케이션 빈ROLE_INFRASTRUCTURE
: 스프링이 내부에서 사용하는 빈ac.getBean(빈이름, 타입)
ac.getBean(타입)
조회 대상 스프링 빈이 없으면 예외가 발생한다.
NoSuchBeanDefinitionException: No bean named 'xxxxx' available
타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다. 이때는 빈 이름을 지정하여 해결할 수 있다.
부모 타입으로 조회하면, 자식 타입도 함께 조회한다.
⇒ 그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다.
스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있도록 유연하게 설계되어 있다.
→ 자바코드, XML, Groovy, ...
지금까지 했던 것이다.
new AnnotationConfigApplicationContext(AppConfig.class)
AnnotationConfigApplicationContext
클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다.최근에는 스프링 부트를 많이 사용하면서 XML기반의 설정은 잘 사용하지 않는다. 아직 많은 레거시 프로젝트 들이 XML로 되어 있고, 또 XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장점도 있으므로 한번쯤 배워두는 것도 괜찮다.
GenericXmlApplicationContext
를 사용하면서 xml 설정 파일을 넘기면 된다.