Loading...
Spring Framework Reference Documentation 7.0.2의 Bean Definition Inheritance의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
bean definition은 constructor argument, property value, initialization method, static factory method name과 같은 컨테이너 전용 정보를 포함하여 많은 설정 정보를 가질 수 있습니다. child bean definition은 parent definition으로부터 설정 데이터를 상속합니다. child definition은 필요한 경우 일부 값을 오버라이드하거나 다른 값을 추가할 수 있습니다. parent와 child bean definition을 사용하면 많은 타이핑을 절약할 수 있습니다. 사실상 이것은 일종의 템플릿 방식입니다.
ApplicationContext 인터페이스를 프로그래밍 방식으로 사용할 경우, child bean definition은 ChildBeanDefinition 클래스에 의해 표현됩니다. 대부분의 사용자는 이런 레벨로 작업하지 않습니다. 대신 ClassPathXmlApplicationContext와 같은 클래스에서 bean definition을 선언적으로 구성합니다. XML 기반 설정 메타데이터를 사용할 때는 parent attribute를 사용하여 child bean definition을 표시할 수 있으며, 이 attribute의 값으로 parent bean을 지정합니다.
다음 예제는 이를 수행하는 방법을 보여줍니다:
1<bean id="inheritedTestBean" abstract="true" 2 class="org.springframework.beans.TestBean"> 3 <property name="name" value="parent"/> 4 <property name="age" value="1"/> 5</bean> 6 7<bean id="inheritsWithDifferentClass" 8 class="org.springframework.beans.DerivedTestBean" 9 parent="inheritedTestBean" init-method="initialize"> (1) 10 <property name="name" value="override"/> 11 <!-- the age property value of 1 will be inherited from parent --> 12</bean>
| 1 | parent attribute에 주목하십시오. |
child bean definition은 bean class가 지정되지 않은 경우 parent definition의 bean class를 사용하지만, 이를 오버라이드할 수도 있습니다. 후자의 경우 child bean class는 parent와 호환되어야 합니다(즉, parent의 property value를 받아들일 수 있어야 합니다).
child bean definition은 parent로부터 scope, constructor argument value, property value, method override를 상속하며, 새로운 값을 추가할 수 있는 옵션을 가집니다. 지정한 scope, initialization method, destroy method 또는 static factory method 설정은 해당 parent 설정을 오버라이드합니다.
나머지 설정은 항상 child definition에서 가져옵니다: depends on, autowire mode, dependency check, singleton, lazy init.
앞의 예제는 abstract attribute를 사용하여 parent bean definition을 명시적으로 abstract로 표시합니다. parent definition이 class를 지정하지 않는 경우, 다음 예제가 보여 주듯이 parent bean definition을 abstract로 명시적으로 표시해야 합니다:
1<bean id="inheritedTestBeanWithoutClass" abstract="true"> 2 <property name="name" value="parent"/> 3 <property name="age" value="1"/> 4</bean> 5 6<bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean" 7 parent="inheritedTestBeanWithoutClass" init-method="initialize"> 8 <property name="name" value="override"/> 9 <!-- age will inherit the value of 1 from the parent bean definition--> 10</bean>
parent bean은 불완전하며, 또한 명시적으로 abstract로 표시되어 있기 때문에 자체적으로는 인스턴스화될 수 없습니다. definition이 abstract인 경우, child definition을 위한 parent definition 역할을 하는 순수 템플릿 bean definition으로만 사용할 수 있습니다.
다른 bean의 ref property로 이를 참조하거나 parent bean ID로 getBean()을 명시적으로 호출하여 이러한 abstract parent bean을 자체적으로 사용하려고 하면 에러가 발생합니다. 마찬가지로, 컨테이너의 내부 preInstantiateSingletons() 메서드는 abstract로 정의된 bean definition은 무시합니다.
ApplicationContext는 기본적으로 모든 singleton을 미리 인스턴스화합니다. 따라서 (적어도 singleton bean의 경우) 템플릿으로만 사용할 의도인 (parent) bean definition이 있고 이 definition이 class를 지정하는 경우, abstract attribute를 반드시 _true_로 설정해야 합니다. 그렇지 않으면 애플리케이션 컨텍스트가 실제로abstractbean을 미리 인스턴스화(시도)하게 됩니다.
Customizing the Nature of a Bean
Container Extension Points