스프링 컨테이너 종류
- BeanFactory와 이를 상속한 ApplicationContext두가지 유형 컨테이너 제공
BeanFactory
- 스프링 설정파일에 등록된 <bean>객체를 생성하고 관리하는 가장 기본적인 컨테이너 기능만 제공
- 컨테이너 구동될때 <bean>객체를 생성하는것이 아니라, 클라이언트 요청(Lookup)에 의해서만 <bean>객체가 생성되는 지연 로딩(Lazy Loading)방식을 사용. 일반적인 스프링 프로젝트에 BeanFactory를 사용할 일은 전혀 없음
ApplicationContext
- BeanFactory가 제공하는 <bean>객체 관리 기능 외에, 트랜잭션 관리나 메시지 기반의 다국어 처리 등, 다양한 기능을 제공. 컨테이너가 구동되는 시점에 <bean>에 등록된 클래스들을 객체 생성하는 즉시 로딩(pre-loading) 방식으로 동작
- 웹 애플리케이션 개발도 지원하므로 대부분 스프링 프로젝트는 ApplicationContext 유형의 컨테이너를 이용
구현클래스
GenericXmlApplicationContext : 파일시스템이나 클래스 경로에 있는 XML설정 파일을 로딩하여 구동하는 컨테이너
XmlWebApplicationContext : 웹 기반의 스프링 애프리케이션을 개발할 때 사용하는 컨테이너
src/main/java/polymorphsim/TvUser.java
package polymorphsim;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TvUser {
public static void main(String[] args) {
/*
BeanFactory factory = new BeanFactory();
TV tv = (TV)factory.getBean(args[0]);
*/
//1. Spring 컨테이너를 구동
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
//2. Spring 컨테이너로 부터 필요한 객체를 요청(Lookup)
TV tv = (TV)factory.getBean("tv");
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
// 3. Spring컨테이너를 종료
factory.close();
}
}
실행결과
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@69a10787: startup date [Sun Jan 02 15:34:48 KST 2022]; root of context hierarchy
===> SamsungTV() 객체생성
SamsungTv --전원 켠다.
SamsungTv --소리 올린다.
SamsungTv --소리 내린다
SamsungTv --전원 끈다.
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@69a10787: startup date [Sun Jan 02 15:34:48 KST 2022]; root of context hierarchy
src/main/resources/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id ="tv" class="polymorphsim.SamsungTV"/>
</beans>
<bean>, <description>, <alias>, <import>등 네개 엘리먼트를 자식 엘리먼트로 사용가능
<bean>과 <import>정도가 실제 프로젝트에서 사용
<import> 엘리먼트
- 스프링 설정파일 하나에 모든 클래스를 <bean>으로 등록/관리 할 수 있지만, bean이외에도 트랜잭션관리,예외처리, 다국어 처리등 다양한 설정 필요. 모든파일을 하나로 관리하지 않고 xml파일로 나눠서 사용하는게 효과적
<beans>
<import resource="context-datasource.xml"/>
<import resource="context-trransaction.xml"/>
</beans>
<bean> 엘리먼트
- id와 class속성을 사용. id는 생략가능, class속성은 필수
- id속성 : 자바 식별자 작성 규칙, CamelCase사용, id는 유일해야함
- class속성 : 클래스 등록할 때는 정확한 경로와 클래스 이름 지정 필수
- name속성 : id와 같은기능. 자바 식별자 규칙 따르지 않아도 됨. 특수문자 허용
src/main/resources/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id ="tv" class="polymorphsim.SamsungTV" init-method="initMethod" destroy-method="destroyMethod" lazy-init="true" scope="singleton"/>
</beans>
속성 | 예시 | 설명 | 소스 |
init-method | init-method="initMethod" | 객체 생성후 멤버변수 초기화 작업 필요할때 사용 컨테이너 구동후 SamsungTV객체 생성직후 호출 |
SamsungTV에 메소드 추가 public void initMethod() { System.out.println("객체 초기화 작업 처리.."); } |
destroy-method | destroy-method="destroyMethod" | 스프링 컨테이너가 객체를 삭제하기 직전에 임의의 메소드 지정 컨테이너 종료직전 컨테이너 관리하는 모든객체 삭제 SamsungTV객체 삭제직전 호출 |
SamsungTV에 메소드 추가 public void destroyMethod() { System.out.println("객체 삭제 전 처리할 로직 처리.."); } |
lazy-init | lazy-init="true" | 컨테이너 구동시점이 아닌, 해당 bean이 구동되는 시점에 객체 생성 true : 클라이언트 요청시점에 생성 (메모리 효율적 관리) |
- |
scope | scope="singleton" (기본) scope="prototype" |
sigleton : 객체 단 하나만 생성되어 유지 prototype: 컨테이너는 bean이 요청될 때마다 새로운 객체 생성 |
TVUser에 객체 여러개 TV tv1 = (TV)factory.getBean("tv"); TV tv2 = (TV)factory.getBean("tv"); TV tv3 = (TV)factory.getBean("tv"); |
'IT > SPRING' 카테고리의 다른 글
[SPRING] 어노테이션 설정 (0) | 2022.01.05 |
---|---|
[SPRING] 의존성 주입 (0) | 2022.01.04 |
[SPRING] 프레임워크 개요 (0) | 2022.01.02 |
[환경셋팅] 스프링 개발 환경 셋팅 (0) | 2021.12.28 |
02_스프링 특징 (0) | 2020.01.03 |