container
1.스프링 컨테이너(Bean Factory)
빈객체를 관리하고 각 객체가 의존관계를 설정해주는 컨테이너
대표적 구현클래스 : XmlBeanFactory
외부 자원으로부터 설정정보를 읽어와 빈 객체를 생성함
2.스프링 컨테이너(ApplicationContext)
BeanFatory 인터페이스를 상속받은 하위 인터페이스
메세지의 국제화 , 리소스의 관리 및 로딩, 이벤트 처리
대표적 구현클래스 : GenericXmlApplicationContext
이객체들은 context.getBean()로 가져올수있다.
Beanfatory는 단순히 컨테이너 객체를 생성하고 DI를 처리해주는 기능을 제공한다. 하지만 스프링을 사용하는 이유는 다양한 부가기능(편리한 트랜잭션, 자바 코드기반 스프링 설정, 애노테이션을 사용한 빈설정, 메시지 처등 ) 때문이다. 그리고 이런 기능을 사용하기 위해선 beanfatory만 사용하는 것은 매우 드물며 applicationContext계열을 사용한다.
applicationContext 인터페이스와 관련된 클래스 계층 구조에서 제일 하단의 것으로 실제 사용되는 클래스 목록이다.
-GenericXMLApplicationContext : XML파일을 설정 정보로 사용하는 스프링 컨테이너 구현 클래스이다. 독립형 어플리케이션을 만들때 사용한다. 3.0부터 추가되었으며 그전에는 classPathXmlApplication(클래스패스에서 설정파일을 읽어온다) + FileSystemXmlApplicatio(로컬파일에서 설정파일을 읽어온다 )이 대신함
-AnntationConfigApplicationContext: 자바코드를 설정 정보로 사용하는 스프링컨테이너
-GenericGroovyApplicationContext: 그루비 언어로 작성될 설정정보를 사용하는 스프링컨테이너
-XmlWebApplicationContext: 웹 어플리케이션을 개발할때 스프링 컨테이너로써 xml파일을 설정 정보로 사용한다.
-AnnotationConfigWebApplicationContext: 웹 어플리케이션을 개발할때 사용하는 스프링 컨테이너
3.스프링 컨테이너(WebApplicationContext)
모든 클래스 파일이 이 부분에 올라가는 것이 아닌 context-scan 관련 어노테이션 클래스파일만 업로드되어 객체가 생성된다.
이 객체들을 getBeanDefinitionNames();로 가져올수있다.
dispatcherServlet이 xx-servlet.xml을 읽어와 webApplicationContext를 만든다. 나머지 설정 xml파일은 contextLoadListener또는
ContextLoaderServlet이 webapplication을context를 만들때 사용한다.
이 webapplicaionContext는 applicationContext를 상속받아 여러 서블릿이 공통으로 사용하는 빈들을 사용할수 있게 된다.
그렇기 때문에 만들어지는 순서가 중요하다.
ContextLoaderServlet을 사용했을 때는 load의 설정 값을 1을 주어 ApplicationContext를 DispatcherServlet보다 먼저 만드다.
이 설정을 하는 이유는 DispatcherServlet이 하나의 Web Application에 여러개일 수 있기 때문이다.
여러 개의 DispatcherServlet에서 공통으로 사용할 빈들을 상위 ApplicationContext에 선언해두어 공유할 수 있게 하는 것이다.
컨테이너의 생성과 종료
-컨테이너 생성
-빈 메타정보(xml이나 자바기반설정)를 이용해서 빈 객체 생성
xml
GenericXmlApplication ctx = new GenericXmlApplication();
ctx.load( "classpath:config.xml" ); // 메타 정보 제공 및
ctx.refresh(); //읽어온 메타정보로 빈 객체 재생성
java
GenericXmlApplication ctx = new GenericXmlApplication();
ctx.register( config.class )
ctx.refresh();
refresh는 초기화 과정이기도 하므로 반드시 실행되어야한다.
-컨테이너 사용
-컨테이너 종료
일반적으로 close()를 호출하지만 강제종료일때 registerShutdownHook()을 사용한다.
bean
스프링 컨테이너는 빈객체를 생성하고 초기화하고 소멸한다.
그리고 그 단계마다 빈 객체의 매서드를 실행한다.
1.빈객체 생성
2.빈 프로퍼티 설정
3.BeanNameAware.setBeanName() //빈생성시 컨테이너에서 빈이름을 전달받는다.
4.ApplicationContextAware.setApplicationContext() //빈생성시 컨테이너를 전달 받는다. >> 컨테이너 기능 사용가능
5.BeanPostProcessor의 초기화 전처리
6.초기화
6-1.@postConstruct
6-2.InitializingBean.atferPropertiesSet()
6-3. 커스텀 init 메서드
7.BeanPostProcessor의 초기화 후 처리
8.빈객체의 사용
9.소멸
9-1.@preDestory 메서드
9-2.DisposableBean.destory()
9-3.커스텀 destory 메서드
*<context:annotation-config>를 사용하면 CommonAnnotationBeanProcessor가 빈으로 등록되면서 초기화,소멸 ( 6-1, 9-1 )사용가능
*커스텀 메소드는 bean태그에서 init-method , destory-method를 사용하면 된다.
'STUDY > SPRING' 카테고리의 다른 글
TRANSACTION (0) | 2018.11.06 |
---|---|
MVC (0) | 2018.11.02 |
[코드로 배우는 스프링 웹프로젝트] (0) | 2018.10.31 |
Annotation (0) | 2018.10.30 |
[코드로 배우는 스프링 웹프로젝트] PART 1. 프로젝트의 기본구조 구성 (0) | 2018.10.29 |