반응형

Spring - Bean Definition Inheritance


(원문 위치 : http://www.tutorialspoint.com/spring/spring_bean_definition_inheritance.htm )

Bean 정의(definition)는 생성인자, 속성값, 초기화 함수, 정적 factory 함수명 같은 container관련 정보 등을 포함하는 많은 설정정보를 포함할 수 있다.

자식 bean 정의는 부모의 정의로부터 설정 데이터를 상속받는다. 자식 정의는 필요시 값을 override 혹은 추가할 수 있다.

Spring Bean definition 상속은 java class상속과는 아무 관계가 없지만, 상속의 개념은 동일하다. 부모 bean의 정의를 template로써 정의하고 다른 자식 bean은 부모 bean으로부터 필요한 설정을 상속받을 수 있다.

XML기반 설정 metadata를 사용할 때 속성의 값으로써 부모 bean을 나타내는 'parent'속성을 사용하여 자식 bean을 정의한다.

Example:

[003] HelloWorld Example을 참조하여 프로젝트를 생성한다.

Beans.xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
      <property name="message1" value="Hello World!"/>
      <property name="message2" value="Hello Second World!"/>
   </bean>

   <bean id="helloIndia" class="com.tutorialspoint.HelloIndia" parent="helloWorld">
      <property name="message1" value="Hello India!"/>
      <property name="message3" value="Namaste India!"/>
   </bean>

</beans>

'helloWorld' bean에 message1, message2 속성을 정의한다. 'helloIndia' bean은 parent 속성을 사용하여 'helloWorld'의 자식으로서 정의하고 message2는 그대로 상속받고 message1은 override, 그리고 message3를 추가한다.

HelloWorld.java:

package com.tutorialspoint;

public class HelloWorld {
   private String message1;
   private String message2;

   public void setMessage1(String message){
      this.message1  = message;
   }

   public void setMessage2(String message){
      this.message2  = message;
   }

   public void getMessage1(){
      System.out.println("World Message1 : " + message1);
   }

   public void getMessage2(){
      System.out.println("World Message2 : " + message2);
   }
}

HelloIndia.java:

package com.tutorialspoint;

public class HelloIndia {
   private String message1;
   private String message2;
   private String message3;

   public void setMessage1(String message){
      this.message1  = message;
   }

   public void setMessage2(String message){
      this.message2  = message;
   }

   public void setMessage3(String message){
      this.message3  = message;
   }

   public void getMessage1(){
      System.out.println("India Message1 : " + message1);
   }

   public void getMessage2(){
      System.out.println("India Message2 : " + message2);
   }

   public void getMessage3(){
      System.out.println("India Message3 : " + message3);
   }
}

MainApp.java:

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

      objA.getMessage1();
      objA.getMessage2();

      HelloIndia objB = (HelloIndia) context.getBean("helloIndia");
      objB.getMessage1();
      objB.getMessage2();
      objB.getMessage3();
   }
}
실행 결과는 아래와 같이 상속받은 message2는 그대로 출력되고, override한 message2는 변경된 내용으로, 새로 추가된 message3는 자식에서만 출력되고 있음을 알 수 있다.
World Message1 : Hello World!
World Message2 : Hello Second World!
India Message1 : Hello India!
India Message2 : Hello Second World!
India Message3 : Namaste India!


Bean Definition Template:

많은 노력을 들이지 않고 다른 자식 bean을 정의하는 것으로 사용될 수 있는 Bean definition template를 생성할 수 있다. Bean Definition Template가 정의할 때 특정 class 속성을 지정하지 않고 아래처럼 abstract 속성이 true로 하여 지정할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="beanTeamplate" abstract="true">
      <property name="message1" value="Hello World!"/>
      <property name="message2" value="Hello Second World!"/>
      <property name="message3" value="Namaste India!"/>
   </bean>

   <bean id="helloIndia" class="com.tutorialspoint.HelloIndia" parent="beanTeamplate">
      <property name="message1" value="Hello India!"/>
      <property name="message3" value="Namaste India!"/>
   </bean>

</beans>
부모 bean은 불완전하기때문에 인스턴스화될 수 없고 'abstract'로 명시적으로 표시되어야 한다. 이처럼 abstract로 정의되면, 오직 자식 정의(definition)을 위한 보모정의를 제공하는 순수 템플린 bean 정의(pure template bean definition)으로써 사용할 수 있다.



반응형

+ Recent posts