Bean Definition Inheritance(한글)
Bean 정의에는 생성자 인수, property 값, 초기화 방법, 정적 팩토리 메서드 이름과 같은 컨테이너별 정보 등 많은 구성 정보가 포함될 수 있습니다. 자식 Bean 정의는 부모 정의에서 구성 데이터를 상속합니다. 자식 정의는 필요에 따라 일부 값을 재정의하거나 다른 값을 추가할 수 있습니다. 부모 및 자식 빈 정의를 사용하면 많은 타이핑을 절약할 수 있습니다. 사실상 이것은 템플릿의 한 형태입니다.
프로그래밍 방식으로 ApplicationContext
인터페이스로 작업하는 경우, 자식 빈 정의는 ChildBeanDefinition
클래스로 표현됩니다.
대부분의 사용자는 이 수준에서 작업하지 않습니다.
대신, ClassPathXmlApplicationContext
와 같은 클래스에서 선언적으로 빈 정의를 구성합니다.
XML 기반 구성 메타데이터를 사용하는 경우 parent
속성을 사용하여 부모 빈을 이 속성의 값으로 지정하여 자식 빈 정의를 나타낼 수 있습니다.
다음 예제는 그 방법을 보여줍니다:
<bean id="inheritedTestBean" abstract="true"
class="org.springframework.beans.TestBean">
<property name="name" value="parent"/>
<property name="age" value="1"/>
</bean>
<bean id="inheritsWithDifferentClass"
class="org.springframework.beans.DerivedTestBean"
parent="inheritedTestBean" init-method="initialize"> (1)
<property name="name" value="override"/>
<!-- the age property value of 1 will be inherited from parent -->
</bean>
1 | Note the parent attribute. |
자식 Bean 정의는 부모 정의가 지정되지 않은 경우 부모 정의의 Bean 클래스를 사용하지만 지정되지 않은 경우 부모 정의의 Bean 클래스를 사용하지만 재정의할 수도 있습니다. 후자의 경우, 자식 Bean 클래스는 부모와 와 호환되어야 합니다(즉, 부모의 속성 값을 허용해야 합니다).
자식 Bean 정의는 범위, 생성자 인수 값, property 값 및 메서드 오버라이드와 함께 새로운 값을 추가할 수 있는 옵션을 부모로부터 상속받습니다. 모든 범위, 초기화 메서드, 파괴 메서드 또는 지정한 'static' 팩토리 메서드 설정은 해당 부모 설정을 재정의합니다.
나머지 설정은 항상 자식 정의에서 가져옵니다, Autowiring 모드, 의존성 검사, 싱글톤 및 지연 초기화.
앞의 예에서는 abstract
속성을 사용하여 부모 Bean 정의를 추상적으로 명시적으로 표시합니다.
부모 정의에 클래스가 지정되지 않은 경우 다음 예제에서와 같이 부모 Bean 정의를 명시적으로 abstract
으로 표시해야 합니다:
<bean id="inheritedTestBeanWithoutClass" abstract="true">
<property name="name" value="parent"/>
<property name="age" value="1"/>
</bean>
<bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean"
parent="inheritedTestBeanWithoutClass" init-method="initialize">
<property name="name" value="override"/>
<!-- age will inherit the value of 1 from the parent bean definition-->
</bean>
부모 Bean은 불완전하기 때문에 자체적으로 인스턴스화할 수 없으며, 명시적으로 abstract
으로 표시됩니다.
정의가 abstract
인 경우, 자식 정의의 부모 정의 역할을 하는 순수한 템플릿 Bean 정의로만 사용할 수 있습니다.
이러한 abstract
부모 Bean을 다른 Bean의 ref property로 참조하거나 부모 Bean ID로 명시적인 getBean()
호출을 수행하여 자체적으로 사용하려고 하면 오류가 반환됩니다.
마찬가지로 컨테이너의 내부 preInstantiateSingletons()
메서드는 추상적으로 정의된 Bean 정의를 무시합니다.
ApplicationContext 는 기본적으로 모든 싱글톤을 사전 인스턴스화합니다.
따라서 (적어도 싱글톤 Bean의 경우) 템플릿으로만 사용하려는 (parent) Bean 정의가 있고 이 정의가 클래스를 지정하는 경우 abstract 속성을 true로 설정해야 합니다. 그렇지 않으면 애플리케이션 컨텍스트가 실제로 abstract Bean을 사전 인스턴스화하려고(시도하려고) 할 것입니다.
|