스프링 컨테이너는 내부에 존재하는 애플리케이션 빈의 생명주기를 관리한다.
BEAN 생성, 관리, 제거 등의 역활을 담당한다.
스프링컨테이너가 우리를 대신하여 객체를 관리해주는 핵심 컴포넌트였다.
스프링 컨테이너는 ApplicationContext
이고, 인터페이스로 구현되어있다. (다형성 적용)
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
스프링 컨테이너는 XML, 애너테이션 기반의 자바
설정 클래스로 만들수 있다. 또한 컨테이너는 개발자가 정의한 Bean을 객체로 만들어 관리하다가 개발자가 필요로 할 때 제공해준다.
의존성 주입을 통해 애플리케이션의 컴포넌트를 관리힌다
- 스프링 컨테이너는 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할을 한다.
- 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다.
- 메서드가 언제, 어디서 호출되어야 하는지, 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않는다.
빈은 컨테이너가 만들고 관리하는 객체를 부르는 별명이고 이전에 제어의 역전에서 말했던 것 처럼 컨테이너가 제어를 하는것이다.
스프링 컨테이션 생성 코드
// Spring Container 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
스프링 컨테이너의 대단한 점은 스프링 빈 조회에서 상속관계가 있을 시 부모타입으로 조회하면 자식 타입도 함께 조회한다는 점이다. 스프링이 알아서 자식객체까지 찾아서 정확한 정보를 가져다 준다는게 참으로 신기하다.
컨테이너를 인스턴스화 시켜서 생성자에 제공된 위치 경로 또는 경로는 컨테이너가 로컬 파일 시스템, Java CLASSPATH 등과 같은 다양한 외부 리소스로부터 구성 메타데이터를 로드할 수 있도록 하는 리소스 문자열이다.
// Annotation
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// XML
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다. 또한 Spring컨테이너가 관리하는 자바 객체를 의미하고 하나 이상의 빈을 관리한다.
내가 헷갈린 이유는 빈과 스프링 빈이 다르다는 점을 모른것같다.
빈은 자바 빈, 스프링 빈 이렇게 두개로 나눌수 있는데 두개는 분명하게 다르다.
자바 빈의 경우 단순하게 클래스에서 Getter / Setter만 가지고 있는 클래스를 의미한다. 게터세터외 다른 것을 가지고 있다면, 그것은 자바빈이라고 말하지 않는다.
스프링 빈의 경우는 위에서 말했듯이 스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다. 또한 Spring컨테이너가 관리하는 자바 객체를 의미하고 하나 이상의 빈을 관리한다.
// AppConfig 클래스
컨텍스트를 인스턴스화할 때
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}