1.7.1 빈 정의 상속

java에서 클래스 상속처럼 스프링의 빈도 상속가능

  • 부모의 모든 설정정보를 parent bean으로 부터 상속 받을 수 있다.

ex) bean 정의, 초기화방법,속성값, 및 컨테이너에 특화된 정보 등..

Bean 정의에는 생성자 인수, 등록 정보 값 및 컨테이너 고유 정보 (예 : 초기화 메소드, 정적 팩토리 메소드 이름 등)와 같은 많은 구성 정보가 포함될 수 있습니다. 하위 bean 정의는 상위 정의에서 구성 데이터를 상속합니다. 하위 정의는 일부 값을 대체하거나 필요에 따라 다른 값을 추가 할 수 있습니다. 부모와 자식 bean 정의를 사용하면 많은 타이핑을 줄일 수 있습니다. 효과적으로, 이것은 템플릿의 한 형태입니다.

ApplicationContext프로그래밍 방식 으로 인터페이스로 작업하는 경우 , 하위 bean 정의는 ChildBeanDefinition클래스 로 표시됩니다 . 대부분의 사용자는이 수준에서 작업하지 않습니다. 대신에, ClassPathXmlApplicationContext와 같은 클래스에서 선언적으로 bean 정의를 설정한다. XML 기반의 설정 메타 데이터를 사용한다면, parent 빈을 이 애트리뷰트의 값으로 지정하여 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">  //메모 parent속성을.

    <property name="name" value="override"/>
    <!-- the age property value of 1 will be inherited from parent -->
</bean>

하위 bean 정의는 아무 것도 지정되지 않은 경우 상위 bean 정의의 클래스를 사용하지만 무시할 수도 있습니다. 후자의 경우 하위 Bean 클래스는 부모와 호환 가능해야합니다 (즉, 부모의 속성 값을 받아 들여야 함).

하위 bean 정의는 범위, 생성자 인수 값, 특성 값 및 상위로부터 메소드 대체를 상속하며 새 값을 추가하는 옵션이 있습니다. 지정한 모든 범위, 초기화 메서드, 파괴 메서드 또는 static 팩터리 메서드 설정은 해당 부모 설정보다 우선합니다.

나머지 설정은 항상 하위 정의에서 가져온다 : depends on, autowire mode, dependency check, singleton, lazy init.

앞의 예에서는 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 정의로만 사용할 수 있습니다. 다른 Bean의 ref 특성으로 참조하거나 부모 bean Id와 함께 명시 적 getBean() 호출을 수행하여 이러한 abstract 부모 Bean을 자체적으로 사용하려고 시도하면 오류가 리턴됩니다. 마찬가지로 컨테이너의 내부 preInstantiateSingletons() 메소드는 추상으로 정의 된 bean 정의를 무시합니다.

ApplicationContext기본적으로 모든 싱글 톤을 미리 인스턴스화합니다. 따라서 최소한 (싱글 톤 bean의 경우) 템플리트로만 사용하려는 (상위) Bean 정의가 있고이 정의가 클래스를 지정하는 경우, abstract 속성을 true 로 설정해야 합니다 그렇지 않으면 응용 프로그램 컨텍스트가 실제로 abstractBean을 미리 인스턴스화합니다 (시도하려고합니다) .

Last updated