Bean Definition Inheritance

2023. 4. 28. 15:39Spring Framework/Spring IoC

빈 정의는 생성자 아규먼트, 속성 값, 그리고 초기화 메서드나 정적 팩토리 메서드 이름과 같은 컨테이너별 정보를 포함하는 많은 구성 정보를 포함할 수 있습니다. 자식 빈 정의는 부모 정의의 구성 데이터를 상속받을 수 있습니다. 자식 정의는 필요한 경우 일부 값을 재정의하거나 다른 값을 추가할 수 있습니다. 부모와 자식 빈 정의를 사용하면 입력해야 할 내용을 많이 줄일 수 있으며, 이는 일종의 템플릿 기능으로 효과적으로 작용합니다.

만약 프로그래밍 방식으로 ApplicationContext 인터페이스를 사용한다면, 자식 빈 정의는 ChildBeanDefinition 클래스로 표현됩니다. 대부분의 사용자는 이 수준에서 작업하지 않으며, 대신 ClassPathXmlApplicationContext와 같은 클래스에서 선언적으로 빈 정의를 구성합니다. XML 기반의 구성 메타데이터를 사용할 때는 부모 속성을 사용하여 자식 빈 정의를 표시할 수 있으며, 이 속성에 부모 빈을 값으로 지정합니다. 다음 예시는 이를 구현하는 방법을 보여줍니다.

<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) parent 속성에 주의

 

자식 빈 정의는 명시되지 않은 경우 부모 정의의 빈 클래스를 사용하지만, 이를 재정의할 수도 있습니다. 후자의 경우, 자식 빈 클래스는 부모와 호환되어야 하며(즉, 부모의 속성 값을 수용할 수 있어야 함), 이를 상속할 수 있습니다.

자식 빈 정의는 부모로부터 범위, 생성자 아규먼트 값, 속성 값, 메서드 재정의를 상속받으며, 새 값을 추가할 수도 있습니다. 지정한 범위, 초기화 메서드, 소멸 메서드 또는 정적 팩토리 메서드 설정은 해당하는 부모 설정을 재정의합니다.

나머지 설정은 항상 자식 정의에서 가져옵니다: depends-on, 자동 주입 모드, 의존성 검사, 싱글톤 여부, 지연 초기화.

위의 예에서는 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>

 

부모 빈은 자체적으로 인스턴스화될 수 없습니다. 불완전하며, 명시적으로 추상으로 표시되어 있기 때문입니다. 정의가 추상적일 때, 순수하게 템플릿 빈 정의로만 사용되며, 자식 정의의 부모 정의로만 사용 가능합니다. 다른 빈의 ref 속성에서 이를 참조하거나 부모 빈 ID로 getBean() 호출을 통해 이러한 추상 부모 빈을 사용하려고 하면 오류가 발생합니다. 이와 유사하게, 컨테이너의 내부 preInstantiateSingletons() 메서드는 추상으로 정의된 빈 정의를 무시합니다.

ApplicationContext는 기본적으로 모든 싱글톤을 사전 인스턴스화합니다. 따라서 템플릿으로만 사용하려는 (부모) 빈 정의가 있고, 이 정의가 클래스를 지정하는 경우, abstract 속성을 true로 설정해야 한다는 점이 중요합니다(적어도 싱글톤 빈의 경우). 그렇지 않으면 애플리케이션 컨텍스트가 추상 빈을 실제로 사전 인스턴스화하려고 시도하게 됩니다.