Spring - Herança de definição de feijão

Uma definição de bean pode conter muitas informações de configuração, incluindo argumentos do construtor, valores de propriedade e informações específicas do contêiner, como método de inicialização, nome do método de fábrica estático e assim por diante.

Uma definição de bean filho herda os dados de configuração de uma definição pai. A definição filho pode substituir alguns valores ou adicionar outros, conforme necessário.

A herança da definição do Spring Bean não tem nada a ver com a herança da classe Java, mas o conceito de herança é o mesmo. Você pode definir uma definição de bean pai como um modelo e outros beans filho podem herdar a configuração necessária do bean pai.

Ao usar metadados de configuração baseados em XML, você indica uma definição de bean filho usando o parent atributo, especificando o bean pai como o valor deste atributo.

Exemplo

Vamos ter um Eclipse IDE funcionando e seguir os seguintes passos para criar um aplicativo Spring -

Passos Descrição
1 Crie um projeto com um nome SpringExample e crie um pacote com.tutorialspoint sob osrc pasta no projeto criado.
2 Adicione as bibliotecas Spring necessárias usando a opção Adicionar JARs externos, conforme explicado no capítulo Exemplo do Spring Hello World .
3 Crie classes Java HelloWorld , HelloIndia e MainApp no pacote com.tutorialspoint .
4 Crie o arquivo de configuração do Beans Beans.xml sob osrc pasta.
5 A etapa final é criar o conteúdo de todos os arquivos Java e do arquivo de configuração do Bean e executar o aplicativo conforme explicado abaixo.

A seguir está o arquivo de configuração Beans.xmlonde definimos o bean "helloWorld", que possui duas propriedades message1 e message2 . O próximo bean "helloIndia" foi definido como filho do bean "helloWorld" usandoparentatributo. O bean filho herda a propriedade message2 como está, sobrescreve a propriedade message1 e apresenta mais uma propriedade 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>

Aqui está o conteúdo de HelloWorld.java arquivo -

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);
   }
}

Aqui está o conteúdo de HelloIndia.java arquivo -

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);
   }
}

A seguir está o conteúdo do MainApp.java arquivo -

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

Assim que terminar de criar os arquivos de configuração de código-fonte e bean, vamos executar o aplicativo. Se tudo estiver bem com seu aplicativo, ele imprimirá a seguinte mensagem -

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

Se você observou aqui, não passamos a mensagem2 ao criar o bean "helloIndia", mas ela foi aprovada devido à Herança de definição do bean.

Modelo de definição de feijão

Você pode criar um modelo de definição de bean, que pode ser usado por outras definições de bean filho sem colocar muito esforço. Ao definir um modelo de definição de bean, você não deve especificar oclass atributo e deve especificar abstract atributo e deve especificar o atributo abstrato com um valor de true conforme mostrado no seguinte snippet de código -

<?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>

O bean pai não pode ser instanciado sozinho porque está incompleto e também está explicitamente marcado como abstrato . Quando uma definição é abstrata como esta, ela pode ser usada apenas como uma definição de bean de modelo puro que serve como uma definição pai para definições filho.