스프링 컨테이너 종류 

- 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

+ Recent posts