Учебники

Spring — наследование определения бобов

Определение компонента может содержать много информации о конфигурации, включая аргументы конструктора, значения свойств и информацию, специфичную для контейнера, такую ​​как метод инициализации, имя метода статической фабрики и т. Д.

Определение дочернего бина наследует данные конфигурации из родительского определения. Дочернее определение может переопределять некоторые значения или добавлять другие при необходимости.

Наследование определений Spring Bean не имеет ничего общего с наследованием классов Java, но концепция наследования такая же. Вы можете определить определение родительского компонента в качестве шаблона, а другие дочерние компоненты могут наследовать необходимую конфигурацию от родительского компонента.

Когда вы используете метаданные конфигурации на основе XML, вы указываете определение дочернего компонента с помощью атрибута parent , указывая родительский компонент в качестве значения этого атрибута.

пример

Давайте создадим рабочую среду Eclipse и предпримем следующие шаги для создания приложения Spring:

меры Описание
1 Создайте проект с именем SpringExample и создайте пакет com.tutorialspoint в папке src в созданном проекте.
2 Добавьте необходимые библиотеки Spring с помощью параметра « Добавить внешние JAR-файлы», как описано в главе « Пример Hello World» .
3 Создайте классы Java HelloWorld , HelloIndia и MainApp в пакете com.tutorialspoint .
4 Создайте файл конфигурации Beans Beans.xml в папке src .
5 Последний шаг — создать содержимое всех файлов Java и файла конфигурации Bean и запустить приложение, как описано ниже.

Ниже приведен файл конфигурации Beans.xml, в котором мы определили bean-компонент helloWorld, который имеет два свойства message1 и message2 . Следующий bean-компонент «helloIndia» был определен как дочерний компонент «helloWorld» с использованием родительского атрибута. Дочерний компонент наследует свойство 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();
   }
}

Как только вы закончили создавать файлы конфигурации исходного кода и bean-компонента, давайте запустим приложение Если с вашим приложением все в порядке, оно напечатает следующее сообщение:

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

Если вы заметили, что мы не передали message2 при создании bean-компонента helloIndia, но он был передан из-за наследования определения бина.

Шаблон определения бина

Вы можете создать шаблон определения компонента, который может использоваться другими определениями дочерних компонентов без особых усилий. При определении шаблона определения компонента не следует указывать атрибут класса, а также указывать абстрактный атрибут и указывать абстрактный атрибут со значением 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>

Родительский бин не может быть создан самостоятельно, потому что он неполон, и он также явно помечен как абстрактный . Когда определение является абстрактным, как это, его можно использовать только как определение чистого шаблонного компонента, которое служит родительским определением для дочерних определений.