Spring - Bean Definition Eredità

Una definizione di bean può contenere molte informazioni di configurazione, inclusi argomenti del costruttore, valori di proprietà e informazioni specifiche del contenitore come il metodo di inizializzazione, il nome del metodo factory statico e così via.

Una definizione di bean figlio eredita i dati di configurazione da una definizione padre. La definizione figlio può sovrascrivere alcuni valori o aggiungerne altri, se necessario.

L'ereditarietà della definizione Spring Bean non ha nulla a che fare con l'ereditarietà della classe Java, ma il concetto di ereditarietà è lo stesso. È possibile definire una definizione di bean genitore come modello e altri bean figlio possono ereditare la configurazione richiesta dal bean padre.

Quando si utilizzano metadati di configurazione basati su XML, si indica una definizione di bean figlio utilizzando il parent attributo, specificando il bean genitore come valore di questo attributo.

Esempio

Cerchiamo di avere un IDE Eclipse funzionante e di eseguire i seguenti passaggi per creare un'applicazione Spring:

Passi Descrizione
1 Crea un progetto con un nome SpringExample e crea un pacchetto com.tutorialspoint sottosrc cartella nel progetto creato.
2 Aggiungere le librerie Spring richieste utilizzando l' opzione Aggiungi JAR esterni come spiegato nel capitolo Esempio Spring Hello World .
3 Crea classi Java HelloWorld , HelloIndia e MainApp nel pacchetto com.tutorialspoint .
4 Crea il file di configurazione Beans Beans.xml sottosrc cartella.
5 Il passaggio finale consiste nel creare il contenuto di tutti i file Java e nel file di configurazione Bean ed eseguire l'applicazione come spiegato di seguito.

Di seguito è riportato il file di configurazione Beans.xmldove abbiamo definito il bean "helloWorld" che ha due proprietà message1 e message2 . Il prossimo bean "helloIndia" è stato definito come figlio del bean "helloWorld" utilizzandoparentattributo. Il bean figlio eredita la proprietà message2 così com'è, sovrascrive la proprietà message1 e introduce un'altra proprietà 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>

Ecco il contenuto di HelloWorld.java file -

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

Ecco il contenuto di HelloIndia.java file -

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

Di seguito è riportato il contenuto del file MainApp.java file -

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

Una volta terminata la creazione dei file di configurazione dei bean e dei sorgenti, eseguiamo l'applicazione. Se tutto va bene con la tua applicazione, stamperà il seguente messaggio:

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

Se hai osservato qui, non abbiamo passato message2 durante la creazione del bean "helloIndia", ma è stato superato a causa dell'ereditarietà della definizione del bean.

Modello di definizione del fagiolo

È possibile creare un modello di definizione Bean, che può essere utilizzato da altre definizioni di bean figlio senza impegnarsi molto. Durante la definizione di un modello di definizione bean, non è necessario specificare il fileclass attributo e dovrebbe specificare abstract attributo e dovrebbe specificare l'attributo astratto con un valore di true come mostrato nel seguente frammento di codice:

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

Il bean genitore non può essere istanziato da solo perché è incompleto ed è anche esplicitamente contrassegnato come astratto . Quando una definizione è astratta come questa, è utilizzabile solo come definizione di bean modello puro che funge da definizione padre per le definizioni figlio.