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

+ Recent posts