개요
•
Spring에서는 빈의 생성과 의존성 주입 등을 제어하는 IoC 컨테이너인 Bean Factory가 존재한다.
•
빈의 생성과 의존성 주입 외에 추가적인 기능을 제공하기 위해 Bean Factory를 상속받아 확장한 Application Context를 주로 사용한다.
•
Application Context는 별도의 설정 정보를 토대로 IoC를 적용하여 빈의 생성, 의존성 주입 등의 제어 작업을 총괄한다
•
직접 객체를 생성하고 관계를 맺어주는 코드는 없으며 생성 정보와 연관 관계 정보에 대한 설정을 읽어 처리한다.
◦
@Configuration과 같은 어노테이션이 대표적인 설정 정보이다.
Bean 요청 시 처리 과정
•
객체가 빈을 요청하면 ApplicationContext는 다음과 같은 과정을 거쳐 Bean을 반환한다.
1.
ApplicationContext는 @Configuration 어노테이션이 붙은 클래스들을 설정 정보로 등록해두고 해당 클래스 내부의 @Bean이 붙은 메소드들의 Bean을 각 메소드 명으로 생성한다.
2.
객체가 Bean을 요청한다.
3.
ApplicationContext는 자신의 Bean 목록에서 요청한 이름을 찾는다.
4.
ApplicationContext는 설정 클래스로부터 Bean 생성을 요청하고 생성된 Bean을 반환한다.
•
이때 Spring 내부에서 Reflection API를 통해 Bean Definition에 나오는 클래스의 이름을 이용하거나 Bean Factory를 이용해 Bean을 생성한다.
장점
•
객체는 @Configuration이 붙은 구체적인 팩토리 클래스를 알고 있을 필요가 없다.
◦
어플리케이션이 확장됨에 따라 팩트리 클래스가 늘것이다. 이때 ApplicationContext가 없다면 객체는 원하는 객체를 가져오기 위해 어떤 팩토리 클래스에 의존해야하는 지 결정해야 한다.
◦
반면에 ApplicationContext를 사용하면 팩토리가 아무리 많아져도 이에 직접 접근할 필요가 없어진다. 즉 일관된 방식으로 Bean을 가져올 수 있게 된다.
•
ApplicationContext는 IoC 서비스를 제공해주므로 프로그래머가 코드를 제어할 필요가 없다.
◦
ApplicationContext는 객체의 생성과 의존성 주입 외에도 객체가 만들어지는 방식, 시점, 전략, 후처리 등 다양한 기능을 지원한다.
•
ApplicationContext를 통해 다양한 Bean 탐색 방법을 제공할 수 있다.
◦
Application Context에서 Bean 목록을 관리하여 Bean의 이름이나 타입 또는 어노테이션 설정 등으로 Bean을 찾을 수 있다.
◦
이를 Dependency Lookup이라 부른다.