IOC 컨테이너는 각 컨테이너에서 관리할 객체들을 위한 별도의 설정 파일이 존재한다.
Servlet 컨테이너는 web.xml 파일에 EJB 컨테이너는 ejb.xml 파일에 해당 컨테이너가 생성하고 관리할 클래스들을 등록한다.
위치 : src/main/resources
유형 : Spring Bean Configuration File 선택
이름 : applicationContext 입력
<beans> 루트 엘리먼트와 네임스페이스 관련 설정들이 기본으로 제공된다.
<bean> 엘리먼트 설정이 필요하다. <beans>와 </beans> 사이에 작성해 클래스를 '등록'한다.<bean id="tv" class="polymorphism.SamsungTV"/>
public class TVUser{
public static void main(String[] args){
// 1. Spring 컨테이너를 구동한다.
AbstractApplicationContext factory =
new GenericXmlApplicationContext("applicationContext.xml");
}
}
위 소스는 환경설정 파일인 applicationContext.xml을 로딩하여 스프링 컨테이너 중 하나인 GenericXmlApplicationContext를 구동한다.
public class TVUser{
public static void main(String[] args){
// 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();
}
}
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args) {
// 1. Spring 컨테이너를 구동한다.
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
// 2. Spring 컨테이너로부터 필요한 객체를 요청(Lookup)한다.
TV tv = (TV)factory.getBean("tv");
tv.powerOn();
tv.powerOff();
// 3. Spring 컨테이너 종료
factory.close();
}
}

참고 : log4j.xml에서 info나 debug레벨로 바꿔도 콘솔에 로그가 출력되지 않을 때.
→ 프로젝트 삭제하고 재생성하는 게 빠르다..
참고 : 파일명
파일명을 파일시스템에서 바꾸게 되면 파일이 없어진다. 프로젝트 우클릭 > Refresh를 통해 다시 불러오도록 한다.
파일명은 파일 우클릭 > Refactor > Rename 혹은 Alt + Shift + R로 변경한다.
스프링 컨테이너를 통해 IOC를 구현하는 위의 과정을 다시 정리해보자.
- applicationContext.xml (스프링 설정 파일)에 삼성티비 클래스를 id가 tv인 빈으로 추가한다.
- TVUser 클라이언트가 스프링 설정 파일을 로딩하여 스프링 컨테이너(ApplicationContext)를 구동한다.
- 스프링 설정 파일에 빈으로 등록된 삼성티비 객체를 생성한다.
getBean()메소드로 이름(id)이 tv인 객체를 요청(Lookup)한다.- 삼성티비 객체를 반환한다.
여기서 중요한 것은 티비의 브랜드를 바꿀 때, 설정파일인 applicationContext.xml파일만 수정하면 된다는 것이다. 즉 클라이언트 소스를 수정할 필요가 없다 - 기존 BeanFactory 클래스 사용할 때보다 유지보수가 편리해졌다.
스프링에서는 BeanFactory와 ApplicationContext의 두 가지 컨테이너를 제공하는데, 보통 ApplicationContext를 쓰게 된다. 이를 구현하는 클래스 중 xml 설정 파일을 구동하는 GenericXmlApplicationContext와, 웹기반 스프링 애플리케이션을 개발할 때 사용하는 XmlWebApplicationContext를 가장 많이 사용한다. 우리는 일단 GenericXmlApplicationContext만 기억하고 있으면 되겠다.
<beans> 루트 엘리먼트자식 엘리먼트 중 <bean>과 <import>가 많이 사용된다.
<bean>스프링 설정 파일에 클래스를 등록하기 위해 사용한다.
id속성은 생략할 수 있지만 class속성은 필수다. 패키지 경로와 클래스 이름을 정확하게 등록해야 하므로 자동완성 기능을 꼭 이용하자.
bean에 클래스 속성만 등록해도 객체가 생성된다. 하지만 id속성까지 지정해야 객체를 요청(lookup)할 수 있다. 고유한 값으로 지정해야 하고, Camel Case를 사용한다. 특수기호를 포함할 때는 id대신 name속성을 쓴다.
객체 생성시 디폴트 생성자를 호출하기 때문에 초기화할 수 없는데, 생성 후 초기화 작업이 필요하면 init-method 속성을 사용한다.
init-method="initMethod"
예를 들면 삼성티비 클래스에서 initMethod() 메소드를 만들어 멤버변수에 대한 초기화 작업을 실행하도록 작성한다.
스프링 컨테이너가 객체 삭제 직전에 호출될 임의의 메소드를 지정한다.
ApplicationContext는 구동 시점에 빈 생성 즉시 로딩하는 방식으로 동작한다.
자주 사용되지도 않으면서 메모리를 차지하는 빈을 해결하기 위해 컨테이너 구동 시점이 아니라 해당 빈 사용 시점에 객체를 생성하도록 한다.
lazy-init="true"
하나만 생성해도 되는 객체는 '싱글톤 패턴'을 구현해 제어한다. scope속성의 기본값은 singleton이다. 해당 빈이 스프링 컨테이너에 의해 단 하나만 생성되도록 한다. 여러 번 요청되어도 메모리에 하나만 생성되어 유지된다.
prototype으로 지정할 경우 매번 새로운 객체를 생성한다.