봄-빈 정의 상속

Bean 정의에는 생성자 인수, 속성 값 및 초기화 메서드, 정적 팩토리 메서드 이름 등과 같은 컨테이너 관련 정보를 비롯한 많은 구성 정보가 포함될 수 있습니다.

하위 Bean 정의는 상위 정의에서 구성 데이터를 상속합니다. 하위 정의는 필요에 따라 일부 값을 재정의하거나 다른 값을 추가 할 수 있습니다.

Spring Bean 정의 상속은 Java 클래스 상속과 관련이 없지만 상속 개념은 동일합니다. 상위 Bean 정의를 템플리트로 정의 할 수 있으며 다른 하위 Bean은 상위 Bean에서 필요한 구성을 상속 할 수 있습니다.

XML 기반 구성 메타 데이터를 사용하는 경우 다음을 사용하여 하위 Bean 정의를 표시합니다. parent 이 속성의 값으로 상위 Bean을 지정하는 속성.

작동하는 Eclipse IDE를 준비하고 다음 단계를 수행하여 Spring 애플리케이션을 작성해 보겠습니다.

단계 기술
1 이름이 SpringExample 인 프로젝트를 만들고 아래에 com.tutorialspoint 패키지를 만듭니다 .src 생성 된 프로젝트의 폴더.
2 Spring Hello World 예제 장에 설명 된대로 Add External JARs 옵션을 사용하여 필요한 Spring 라이브러리를 추가하십시오 .
com.tutorialspoint 패키지 아래에 Java 클래스 HelloWorld , HelloIndiaMainApp을 만듭니다 .
4 아래에 Beans 구성 파일 Beans.xml을 만듭니다 .src 폴더.
5 마지막 단계는 모든 Java 파일과 Bean 구성 파일의 내용을 만들고 아래 설명 된대로 응용 프로그램을 실행하는 것입니다.

다음은 구성 파일입니다. Beans.xml여기서 우리는 message1message2 두 가지 속성을 가진 "helloWorld"빈을 정의했습니다 . 다음으로 "helloIndia"bean은 다음을 사용하여 "helloWorld"bean의 자식으로 정의되었습니다.parent속성. 자식 bean 은 message2 속성을 그대로 상속 하고 message1 속성을 재정의 하고 message3 속성을 하나 더 도입 합니다.

<?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.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();
   }
}

소스 및 빈 구성 파일 생성이 완료되면 애플리케이션을 실행 해 보겠습니다. 응용 프로그램에 문제가 없으면 다음 메시지가 인쇄됩니다.

World Message1 : Hello World!
World Message2 : Hello Second World!
India Message1 : Hello India!
India Message2 : Hello Second World!
India Message3 : Namaste India!

여기에서 살펴보면 "helloIndia"bean을 생성하는 동안 message2를 전달하지 않았지만 Bean Definition Inheritance 때문에 전달되었습니다.

빈 정의 템플릿

많은 노력을 기울이지 않고 다른 자식 빈 정의에서 사용할 수있는 빈 정의 템플릿을 만들 수 있습니다. Bean 정의 템플릿을 정의하는 동안 다음을 지정해서는 안됩니다.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>

부모 빈은 불완전하기 때문에 자체적으로 인스턴스화 할 수 없으며 명시 적으로 abstract 로 표시됩니다 . 정의가 이와 같이 추상적 인 경우 하위 정의에 대한 상위 정의 역할을하는 순수한 템플릿 Bean 정의로만 사용할 수 있습니다.