반응형
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)으로써 사용할 수 있다.
반응형