Bean Definition Inheritance

Dev.Hammy·2024년 2월 11일
0

Bean 정의에는 생성자 인수, 속성(property) 값, 초기화 메소드, 정적 팩토리 메소드 이름 등과 같은 컨테이너 특정 정보를 포함한 많은 구성(configuration) 정보가 포함될 수 있습니다. 하위 Bean 정의는 상위 정의에서 구성 데이터를 상속합니다. 하위 정의는 일부 값을 재정의하거나 필요에 따라 다른 값을 추가할 수 있습니다. 상위 및 하위 Bean 정의를 사용하면 많은 입력 작업을 줄일 수 있습니다. 사실상 이것은 템플릿의 한 형태입니다.

프로그래밍 방식으로 ApplicationContext 인터페이스로 작업하는 경우 하위 Bean 정의는 ChildBeanDefinition 클래스로 표시됩니다. 대부분의 사용자는 이 수준에서 작업하지 않습니다. 대신 ClassPathXmlApplicationContext와 같은 클래스에서 선언적으로 Bean 정의를 구성합니다. XML 기반 구성 메타데이터를 사용할 때 parent 속성(attribute)을 사용하고 이 속성의 값으로 상위 Bean을 지정하여 하위 Bean 정의를 표시할 수 있습니다. 다음 예에서는 그 방법을 보여줍니다.

<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 어트리뷰트에 주목

하위 Bean 정의는 아무것도 지정되지 않은 경우 상위 정의의 Bean 클래스를 사용하지만 이를 대체(override)할 수도 있습니다. 후자의 경우 하위 Bean 클래스는 상위와 호환되어야 합니다(즉, 상위의 property 값을 수용해야 합니다).

하위 Bean 정의는 새 값을 추가하는 옵션과 함께 상위 항목의 범위, 생성자 인수 값, 속성 값 및 메서드 재정의를 상속합니다. 사용자가 지정하는 모든 범위, 초기화(initialization) 메서드, 소멸(destroy) 메서드 또는 static 팩터리 메서드 setting은 해당 parent setting을 재정의합니다.

나머지 설정은 항상 child 정의(종속 대상(depends on), autowire 모드, 종속성 검사, 싱글톤 및 지연 초기화)에서 가져옵니다.

이전 예제에서는 abstract 속성(attribute)을 사용하여 상위 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으로 표시됩니다. 정의가 abastract이면 child 정의에 대한 parent 정의 역할을 하는 순수 템플릿 Bean 정의로만 사용할 수 있습니다. 이러한 abastact 상위 Bean을 다른 Bean의 ref property로 참조하거나 상위 Bean ID로 명시적인 getBean() 호출을 수행하여 자체적으로 사용하려고 하면 오류가 반환됩니다. 마찬가지로 컨테이너의 내부 preInstantiateSingletons() 메소드는 abstract로 정의된 Bean 정의를 무시합니다.

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

0개의 댓글