Spring - Herencia de definición de frijol
Una definición de bean puede contener mucha información de configuración, incluidos argumentos de constructor, valores de propiedad e información específica del contenedor, como el método de inicialización, el nombre del método de fábrica estático, etc.
Una definición de bean hijo hereda datos de configuración de una definición padre. La definición secundaria puede anular algunos valores o agregar otros, según sea necesario.
La herencia de la definición de Spring Bean no tiene nada que ver con la herencia de la clase Java, pero el concepto de herencia es el mismo. Puede definir una definición de bean padre como una plantilla y otros beans hijo pueden heredar la configuración requerida del bean padre.
Cuando utiliza metadatos de configuración basados en XML, indica una definición de bean hijo utilizando el parent atributo, especificando el bean padre como el valor de este atributo.
Ejemplo
Tengamos un IDE de Eclipse en funcionamiento y sigamos los siguientes pasos para crear una aplicación Spring:
Pasos | Descripción |
---|---|
1 | Cree un proyecto con un nombre SpringExample y cree un paquete com.tutorialspoint bajo elsrc carpeta en el proyecto creado. |
2 | Agregue las bibliotecas Spring requeridas usando la opción Agregar JAR externos como se explica en el capítulo Ejemplo de Spring Hello World . |
3 | Cree clases de Java HelloWorld , HelloIndia y MainApp en el paquete com.tutorialspoint . |
4 | Cree el archivo de configuración de Beans Beans.xml bajo elsrc carpeta. |
5 | El paso final es crear el contenido de todos los archivos Java y el archivo de configuración de Bean y ejecutar la aplicación como se explica a continuación. |
A continuación se muestra el archivo de configuración Beans.xmldonde definimos frijol "helloWorld", que tiene dos propiedades mensaje 1 y mensaje2 . El siguiente bean "helloIndia" se ha definido como hijo del bean "helloWorld" utilizandoparentatributo. Los hereda de frijol niño Message2 propiedad como es, y anulaciones de mensaje1 propiedad e introduce una más propiedad 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>
Aquí está el contenido de HelloWorld.java archivo -
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);
}
}
Aquí está el contenido de HelloIndia.java archivo -
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 continuación se muestra el contenido de la MainApp.java archivo -
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 vez que haya terminado de crear los archivos de configuración de fuente y bean, ejecutemos la aplicación. Si todo está bien con su aplicación, imprimirá el siguiente mensaje:
World Message1 : Hello World!
World Message2 : Hello Second World!
India Message1 : Hello India!
India Message2 : Hello Second World!
India Message3 : Namaste India!
Si observó aquí, no pasamos message2 al crear el bean "helloIndia", pero se aprobó debido a la herencia de la definición del bean.
Plantilla de definición de frijol
Puede crear una plantilla de definición de Bean, que puede ser utilizada por otras definiciones de Bean hijo sin poner mucho esfuerzo. Al definir una plantilla de definición de frijol, no debe especificar elclass atributo y debe especificar abstract atributo y debe especificar el atributo abstracto con un valor de true como se muestra en el siguiente fragmento 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>
No se puede crear una instancia del bean padre por sí solo porque está incompleto y también se marca explícitamente como abstracto . Cuando una definición es abstracta como esta, solo se puede utilizar como una definición de bean de plantilla pura que sirve como definición principal para las definiciones secundarias.