대부분 IoC 컨테이너는 각 컨테이너에서 관리할 객체들을 위한 별도의 설정 파일이 있다.
스프링 프레임워크도 다른 컨테이너와 마찬가지로 자신이 관리할 클래스들이 등록된 XML 설정 파일이 필요하다.
만들어진 xml 파일에서 가장 중요한 것은 class 속성값이다.
여기에 패키지 경로가 포함된 전체 클래스 경로를 지정해야 한다.
xml 파일을 띄우는 방법은 아래와 같다.
프로젝트의 src/main/resources 소스 폴더를 선택하고,
마우스 오른쪽 버튼을 클릭한다. [New] -> [Other] 메뉴를 클릭하면
'Spring' 폴더에 있는 'Spring Bean Configuration File'을 선택하고 <Next>
FileName에 "applicationContext"를 입력하고 <Finish> 스프링 설정 파일 생성된다.
//1.Spring 컨테이너를 구동한다.
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
//2. Spring 컨테이너로부터 필요한 객체를 요청(lookup)한다.
Tv tv = (TV)factory.getBean("tv);
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args) {
//1.
AbstractApplicationContext factory =
new GenericXmlApplicationContext("applicationContext.xml");
//2.
TV tv1 = (TV)factory.getBean("tv");
tv1.powerOn();
tv1.volumeUp();
tv1.volumeDown();
tv1.powerOff();
/*
* TV tv1 = (TV)factory.getBean("tv"); TV tv2 = (TV)factory.getBean("tv"); TV
* tv3 = (TV)factory.getBean("tv");
*/
//3.
factory.close();
}
}
지금까지의 과정을 그림으로 표현하면 아래와 같다.
객체를 요청하려면 <bean>엘리먼트에 이름이 반드시 지정되어야 한다. 이때 사용하는 속성이 id이다.
이때, "숫자로 시작" ,"공백 포함" , "특수기호 사용" 이 세 가지를 사용하여 id로 지정하면 식별자 작성규칙에 따라 에러가 발생한다.
이럴때는, id와 같은 기능을 하는 속성인 name을 사용한다.
생성자로 멤버변수를 초기화할 수 없다. 따라서 초기화 작업이 필요하다면,
스프링에서는 <bean> 엘리먼트에 init-method를 지원한다.
ex ) init-method = "initMethod"
스프링 컨테이너가 객체를 삭제하기 직전에 호출될 임의의 메소드를 지정할 수 있다.
스프링에서는 <bean> 엘리먼트에 destroy-method를 지원한다.
ex ) destroy-method = "destroyMethod"
lazy-init = "true"라 하면
스프링에서 컨테이너가 구동되는 시점이 아닌 해당 <bean>이 사용되는 시점에 객체를 생성하도록 제공하는 부분이다.
해당 <bean>을 미리 생성하지 않고 클라이언트가 요청하는 시점에 생성한다. 결국, 메모리 관리를 더 효율적으로 할 수 있게 된다.
scope = "singleton" 은
클라이언트에서 세 번 요청했을시, SamsungTV 객체는 메모리에 하나만 생성되어 유지된다.
이 또한 <bean>에서 속성으로 사용된다.
위와 반대로 클라이언트가 매번 요청할때마다
새로운 객체를 생성하여 반환하게끔 하는
scope = "prototype"이 있다.