BeanFactory 와 표면적으로 상당히 유사하다.
빈 로딩, 빈묶기 , 요청에 따른 빈 분배 를 한다.
하지만 applicationContext는 아래와 같은 기능이 더 있다.
1. 국제화(I18N)지원을 포함해 텍스트 메시지를 해석하는 수단제공
2. 이미지 등과같은 자원로딩하는 범용적 방법제공
3. Listener 로 등록되어있는 빈에 이벤트 발생할수 있다.
이동통신기기와 같이 자원이 부족할때 빼곤 위와같은 이유로 BeanFactory보다는 applicationContext를 더 많이 사용한다.
ApplicationContext 구현 클래스중 대표적인 클래스
1. ClassPathXmlApplicationContext - xml파일로부터 컨텍스트정의 로딩 , (클래스 경로)에 있는 자원을 취급
2. FileSystemXmlApplicationContext - 파일시스템에 있는 xml파일로 부터 정의로딩(파일의 특정위치)
3. XmlWebApplicationContext - 웹어플에 포함되어있는 xml파일로부터 정의로딩
위의 어떠한 경우라도 getBean() 메소드를 사용하여 ApplicationContext로 부터 빈을 얻을수 있다. 이러한 이유는 ApplicationContext가 BeanFactory 인터페이스를 확장하였기 때문이다.
ApplicationContext 는 싱글톤(singleton)빈을 로딩하는 방법이 BeanFactory 와 다르다.
즉, 빈팩토리는 모든 빈을 늦게 로딩한다. 애플리케이션 컨텍스트는 컨텍스트시작시 모든 싱글톤 빈을 미리 로딩한다. (기다릴 필요 없이 즉시 사용될 수 있도록 한다.)
bean 은 default 로 싱글톤이다...
꼭 필요할 경우 프로토타입인 singleton="false" 옵션을 설정에
넣어주면 되지만...빈을 위한 각각의 요청은 새롭게 생성된 빈을 만들어내고 실질적으로 원하는것이 되지 않을 수도 있기때문에 비권장이다.
tip)
ref요소는 property정의 요소내에서 허용되는 마지막 요소이다. 컨테이너나 협력자에 의해 관리되는 다른 빈을 참조하기 위해 명시된 프로퍼티 값을 세팅하는데 사용하는 것이다.
ref 태그의 빈 속성을 사용하여 대상 빈을 명시하는 것이 가장 일반적인 형태이다. 빈 속성의 값은 대상 빈의 id 속성이나 name 속성의 값중 하나같이 된다.
<ref bean="someBean"/>
local속성을 사용하여 대상 빈을 명시하는 것은 같은 파일 내 xml id 참조를 위한 xml파서의 기능에 영향을 준다. local속성의 값은 대상 빈의 id 속성과 같아야만한다. 그리고 xml파서는 대응되는 요소가 같은 파일내에 발견되지 않는다면 에러 발생시킨다.(대상 빈이 같은 xml 파일에 있다면 로컬혈태 사용하는 것이 에러발견에 가장 좋다...)
<ref local="someBean"/>
parent속성을 사용하여 대상 빈을 명시하는 것은 현재 빈팩토리의 부모 팩토리내에 있을 빈을 위해 생성될 참조를 허용한다. 즉 부모 빈팩토리나 applicationContext 내에 있어야만한다.
<ref parent="someBean"/>
.lookup - method 삽입
- 컨테이너 내에 명명된 다른 빈을 룩업하는 결과를 반환하는 컨테이너 관리빈을 (추상및 구현된 메소드를)오버라이드 하여 사용하기위한 것이다.
(삽입되어야 할 메소드를 포함하는 클라이언트 클래스 내에서 추상또는 구현된 형태로 정의되어 있어야 한다.)
ex)
protected abstract SingleShotHelper createSingleShotHelper();
추상 메소드가 아닐 경우 Spring은 오버라이드 할 것이다. XmlBeanFactory 는 룩업 메소드 요소를 사용하여 정의된 빈 을 컨테이너로부터 특정빈 반환을 위해 메소드의 삽입및 오버라이드를 하도록 스프링에게 지시한다.
ex)
<bean id="myBean" class="...">
<lookup-method name="createSingleShotHelper"
bean="singleShotHelper"/>
<property>
...
</property>
</bean>
위의 예는 singleShotHelper bean의 새로운 인스턴스 필요시마다 자신의 메소드인 createSingleShotHelper 을 호출한다. 빈 배치시 비싱글톤 처럼 singleShotHelper을 배치해 주기 위해 주의해야 한다. 만약 싱글톤처럼 배치되어 있다면 singleShotHelper의 같은 인스턴스가 매번 반환되기 때문이다.
룩업 메소드삽입은 생성자 삽입 , 세터삽입과 조합될수 있다.
. 임의의 메소드를 변경시...
org.springframework.beans.factory.support.MethodReplacer 인터페이스를 메소드에 정의 하여야 한다.
그리고 아래처럼 사용한다...
( 설명이 필요 없는거라 생각됨...)
<bean id="myValueCalculator
class="x.y.z.MyValueCalculator">
<!-- arbitrary method replacement -->
<replaced-method name="computeValue"
replacer="replacementComputeValue">
<arg-type>String</arg-type>
</replaced-method>
</bean>
<bean id="replacementComputeValue"
class="a.b.c.ReplaceMentComputeValue">
</bean>