방카@Dev
[Spring]Ch4.IoC(Inversion of Control) 컨테이너_올인원 스프링 프레임워크 본문
- IoC 컨테이너 (DI 컨테이너라고도 부름) 설정은 applicationContext.xml
- IoC 컨테이너의 역할은 서비스 객체를 생성하고 필요한 DAO 객체를 생성해서 서비스에 주입
1. Bean의 생성과 초기화
- <bean>은 빈을 가리키는 레퍼런스 변수 이름인 id와 클래스 이름인 클래스 두가지 속성을 가지고 있음.
<bean id="initSampleData" class="패키지를 포함한 클래스 이름"/>
1) <property>를 이용한 필드 초기화
- <property>의 name 속성에는 필드 이름을 명시함
<bean id="initSampleData" class="com.kbfg.digi.InitSampleData">
<property name = "sNums"> //필드 이름
<array>
<value>hbs001</value>
<value>hbs001</value>
<value>hbs001</value>
<value>hbs001</value>
<value>hbs001</value>
</array>
</property>
</bean>
- <bean>은 빈 생성을 위해서 InitSampleData의 생성자를 이용하고, <property>는 sNums를 초기화하기 위해서 sNums의 setter 메서드를 이용함
- 상단의 문법을 이용하기 위해서는 initSampleData 클래스에 기본 생성자가 존재하면서 sNums의 setter가 있어야 함
2) <constructor-arg>를 이용한 필드 초기화
<bean id="studentRegisterService" class="com.kbfg.digi.StudentRegisterService">
<constructor-arg ref="studentDao"/> //생성자 매개변수
</bean>
- 매개변수를 받는 생성자가 있는 클래스의 경우 빈을 생성 시에 객체를 주입받아야 하는데, <constructor-arg> 태그를 이용함
- ref에 bean id값을 입력
3) Main method에서 호출
String configLocation = "classpath:applicationCTX.xml";
AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation); //객체 생성
StudentInfo studentInfo = ctx.getBean("IoC컨테이너에 입력한 id이름",클래스 이름.class);
4) <c>, <p> 태그 이용하는 경우
- 네임스페이스에서 c 또는 p 체크
<bean id="family" class="com.kbfg.digi.Family" c:papaName="홍아빠" c:mamiName="홍엄마" p:sisterName="홍누나">
<property name="brotherName" value="홍오빠"/>
</bean>
//c: constructor-arg p: property
2. 스프링 설정 파일 분리
1) IoC 컨테이너에서 조합하기
- applicationContext.xml을 여러 개로 분리(appCtx1.xml, appCtx2.xml, appCtx3.xml)
- 파일을 분리해도 모든 빈인 동일한 스프링 컨테이너에 의해서 관리됨
String[] appCtxs = {"classpath:appCtx1.xml","classpath:appCtx2.xml","classpath:appCtx3.xml"};
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(appCtxs);
2) <import> 태그 이용하기
//appCtx1.xml 내부
<import resource="classpath:appCtx2.xml"/>
3. 스프링 빈 범위(스코프)
- IoC 컨테이너에서 생성된 빈을 getBean()으로 호출하면 항상 동일한 객체가 반환됨
- 이는 스프링이 기본적으로 객체 범위를 싱글톤으로 관리하기 때문
- 싱글톤은 객체를 호출할때마다 새로 생성하지 않고 기존의 객체를 재활용함
<bean id="student" class="kr.soft.study.Student" scope="prototype">
Scope 범위 | 설명 |
singleton | 해당 bean에 대해 하나의 객체로만 존재(default) |
prototype | 해당 bean에 대해 다수의 객체 존재 |
request | 해당 bean에 대해 하나의 http request의 라이프 사이클에서 단 하나의 객체로 존재 |
session | 해당 bean에 대해 하나의 http session의 라이프 사이클에서 단 하나의 객체로 존재 |
global session | 해당 bean에 대해 하나의 global http session의 라이프 사이클에서 단 하나의 객체로만 존재 |
'BackEnd > Spring' 카테고리의 다른 글
[Spring]Ch8.Service와 DAO 구현_올인원 스프링 프레임워크 (1) | 2024.06.08 |
---|---|
[Spring]Ch7.스프링 MVC를 이용한 웹 서비스 프로젝트_올인원 스프링 프레임워크 (0) | 2024.06.07 |
[Spring]Ch6.@Configuration을 이용한 빈 생성_올인원 스프링 프레임워크 (0) | 2024.06.07 |
[Spring]Ch5.의존 객체 자동주입_올인원 스프링 프레임워크 (0) | 2024.06.06 |
[Spring]STS 및 spring MVC 환경 설정_MacOS (0) | 2024.06.01 |