대부분 프레임 워크가 그렇듯이 스프링 프레임워크 역시 XML 설정이 매우 중요합니다.
그만큼 XML 파일의 과도한 설정에 대한 부담도 큽니다.
대부분 프레임워크는 어노테이션을 이용한 설정을 지원하고 있습니다.
Context 네임스페이스 추가
어노테이션 설정을 추가하려면 다음과 같이 스프링 설정 파일의 루트 엘리먼트인<beans>에 Context 관련 네임스페이스와 스키마 문서의 위치를 등록해야 합니다. 이는 p네임스페이스 를 추가했을 때처럼 Namespaces 탭을 선택하고 'context'항목만 체크하면 간단하게 추가할 수 있습니다.
context를 체크하고 다시 source로 돌아오면
이렇게 소스가 수정된것을 확인할 수 있습니다.
컴포넌트 스캔(component-scan) 설정
스프링 설정 파일에 어플리케이션에서 사용할 객체들을<bean>등록하지 않고
자동으로 생성하려면<context:component-scan />이라는 엘리먼트를 정의해야 합니다. 이설정을 추가하면 스프링 컨테이너는 클래스 패스에 있는 클래스들을 스캔하여 @Component가 설정된 클래스들을 자동으로 객체 생성합니다.
여기서 중요한것은 <context:component-scan> 엘리먼트의 base-package 속성인데, 만약 속성값을 "com.springbook.biz." 형태로 지정하면 com.springbook.biz 패키지로 시작하는 모든 패키지를 스캔대상에 포함 시킵니다.
<context:component-scan> 을 설정했으면 이제 스프링 설정 파일에 클래스들을 일일이 <bean> 엘리먼트로 등록할 필요가 없습니다. @Component만 클래스 선언부 위에 설정하면 끝납니다.
예를 들어 LgTV 클래스에 대한 <bean> 등록을 XML 설정과 어노테이션 설정으로 처리하면 다음과 같습니다. 참고로 아래의 소스는 두 설정을 비교하기 위한 것이므로, 실제로는 둘 중 하나만 선택해 설정해야 합니다. 만약 두 설정을 모두 저장한다면 메모리에는 LgTV 객체가 두개 생설될 것입니다.
당연한거지만 여기에서 두 설정 모두 해당 클래스에 기본 생성자가 있어야만 컨테이너가 객체를 생성할 수 있습니다.
이렇게 설정했다면 클래스의 객체가 메모리에 생성되는 것은 문제가 없습니다. 그러나 클라이언트 프로그램에서 LgTV 객체를 요청할 수는 없습니다.
클라이언트가 스프링 컨테이너가 생성한 객체를 요청하려면, 요청할 때 사용할 아이디나 이름이 반드시 설정되어 있어야 합니다.
따라서 클라이언트의 요청을 위해서라도 아이디 설정이 필요합니다 (@Component("이름"))
id나 name 속성 미지정 시 이름 규칙
스프링 컨테이너가 클래스 객체를 생성할 때, id나 name 속성을 지정하지 않았다면 컨테이너가 자동으로 이름을 설정 해줍니다. 이때 이름 규칙은 클래스 이름의 첫글자를 소문자로 변경하기만 하면 됩니다. 따라서 id나 name 속성이 설정되지 않는 경우 LgTV 객체를 요청하려면 LgTV라는 이름을 사용하면 됩니다.
클래스 선언 부분에 @Component를 설정해줌으로써 스프링 컨테이너는 해당 클래스를 bean 으로 생성하고 관리할수 있습니다. 수정한 파일들을 모두 저장하고 TVUser 프로그램을 실행하면 다음과 같은 실행 결과를 확인 할 수 있습니다.
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");
// GenericXmlApplicationContext = 파일 시스템이나 클래스 경로에 있는 xml 설정 파일을 로딩하여 구동하는 컨테이너 입니다.
// 환경 설정 파일인 applicationContext 파일을 로딩하여 스프링 컨테이너 중 하나인
// GenericXmlApplicationContext를 구동합니다.
// TV tv = new SamsungTV();
// BaenFactory
// BeanFactory factory = new BeanFactory();
// 2. 스프링 컨테이너로 부터 필요한 객체를 요청(Look Up) 합니다.
TV tv = (TV)factory.getBean("tv"); // applicationContext에서 빈아이디 tv로 성정한거를 적용해줘야함
// 매개변수를 넣어주면 원하는 Tv가 출력됨
tv.powerON();
tv.powerOff();
tv.volumDown();
tv.volumUp();
// 3. 스프링 컨테이너를 종료한다.
factory.close();
}
}