-
[SPRING] Spring ContainerSPRING 2021. 8. 21. 10:51
스프링 컨테이너 종류에는 두가지가 있다.
BeanFactory : <bean>객체를 생성하고 관리하는 가장 기본적인 컨테이너 기능 제공. 클라이언트의 요청에 의해서 <bean>객체가 생성되는 지연로딩(Lazy Loading) 방식을 사용한다. (스프링 ~3버전/ deprecated 되었다)
DefaultListableBeanFactory 객체 인스턴스이다
AbstractRefreshableApplicationContext 에서 따로 생성하고 있다.
ApplicationContext : BeanFactory가 제공하는 <bean> 객체를 관리한다. 컨테이너가 구동되는 시점에 <bean>에 등록된 클래스들을 객체 생성하는 즉시로딩(pre loading)방식을 사용한다. (스프링 ~5버전)
ClssPathXmlApplivationContext 객체의 인스턴스이다.
DI(dependency injection)과 IoC(Inverse of conversion) 을 지원한다.
기본적으로 AbstractApplicationContext의 Interface를 구현한 구현체이다.
구현 클래스
-GenericXmlApplicationContext : 파일 시스템이나 클래스 경로에 있는 XML 파일을 로딩하여 구동하는 컨테이너 (직접 빈을 생성하여 XML 설정 파일을 로딩하여 구동하기위해 사용)
-XmlWebApplicationContext : 웹 기반의 스프링 어플리케이션을 개발할 때 사용하는 컨테이너
ApplicationContext는 BeanFactory 기능을 포함하고 자체적으로 BeanPostProcessor, BeanFactoryPostProcessor등을 자체 처리할 수 있다.
BeanFactroy이용하기
TV인터페이스 생성
package polymorphism; public class TVUser { public static void main(String[] arhs) { BeanFactory factory = new BeanFactory(); Scanner sc = new Scanner(System.in); System.out.println("tv 종류 입력 :"); String tname = sc.nextLine(); TV tv = (TV)factory.getBean(tname); tv.powerOn(); tv.powerOff(); tv.volumeUp(); tv.volumeDown(); } }
ApplicationContext 이용하기
<bean> 엘리먼트를 사용하여 스프링 설정 파일에 클래스를 등록하자.
속성
-class : (필수속성) 패키지 경로와 클래스 명을 적어준다.
-id : container 로부터 <bean> 객체를 요청할 때 사용한다. 유일해야하고 생략가능하다. 자바 식별자 작성 규칙을 따른다.
-name : id와 같은 기능이지만 작성규칙을 따르지 않는다.
-init-method : spring container는 클래스 객체를 생성할 때 디폴트 생성자를 호출한다. 객체 생성 후 멤버변수 초기화 작업이 필요한 경우 사용 (init-mehod="init메소드이름")
-destroy-method : spring container가 객체를 삭제하기 직전에 호출될 임의의 메소드를 지정
-lazy-init : xml 로딩 시 객체 생성 여부 설정 (기본값은 false : xml 파일 로딩 시 자동으로 객체 생성 / true : xml 파일 로딩 시 자동으로 객체가 생성되지 않고 getBean으로 가져올 때 생성)
-scope : 객체 범위 설정 ( 기본값은 singleton : 객체를 하나만 생성 / prototype : 객체를 getBean 할 때 생성. 즉, 새로운 주소값 부여)
<import> 엘리먼트 를 사용하여 작성한 설정 파일들을 하나로 통합하자.
<bean>으로 클래스를 등록하고 관리하지만 <bean> 외에도 예외처리, 다국어 처리등 다양한 설정이 필요하다. 이 때 기능별로 여러 xml 파일로 나눠 설정하는 것이 효율적인데, 그 분리하여 작성한 파일들을 통합할 때 사용한다.
spring 컨테이너 구동
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
spring 컨테이너로부터 필요한 객체 요청하기
TV tv = (TV)factory.getBean("tv"); tv.powerOn(); tv.powerOff(); tv.volumeUp(); tv.volumeDown();
package polymorphism; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; public class TVUser2 { public static void main(String[] args) { AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml"); TV tv = (TV)factory.getBean("tv"); tv.powerOn(); tv.powerOff(); tv.volumeUp(); tv.volumeDown(); factory.close(); } }
728x90'SPRING' 카테고리의 다른 글
[SPRING] 데이터 추가, 변경, 삭제 (0) 2021.08.24 [SPRING] Spring 의존성 (0) 2021.08.21 [spring] 20AUG21 @Autowired @Service @Repository (0) 2021.08.20 [spring]의존 자동 주입 어노테이션 (0) 2021.08.20 [Spring] Collection (0) 2021.08.19