Spring框架:Bean定义继承

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

一个bean定义可以包含很多配置信息,包括构造函数参数,属性值和特定于容器的信息,例如初始化方法,静态工厂方法名称等等。

子bean定义从父定义继承配置数据。根据需要,子定义可以覆盖一些值或添加其他值。

Spring Bean定义继承与Java类继承无关,但继承概念相同。您可以将父bean定义定义为模板,其他子Bean可以从父bean继承所需的配置。

在使用基于XML的配置元数据时,可以使用属性指定子bean定义,并指定父bean作为此属性的值。

让我们有一个可用的Eclipse IDE,并采取以下步骤创建一个Spring应用程序 -

描述
1 创建一个名称为SpringExample的项目,并在创建的项目的src文件夹下创建一个com.breakyizhan包。
2 按照Spring Hello World Example章节的介绍,使用Add External JARs选项添加所需的Spring库。
3 com.breakyizhan包下创建Java类HelloWorldHelloIndiaMainApp
4 src文件夹下创建Beans配置文件Beans.xml
5 最后一步是创建所有Java文件和Bean配置文件的内容并按照下面的说明运行应用程序。

以下是配置文件beans.xml中,我们定义的“HelloWorld”豆它有两个属性message1和message2。接下来,通过使用parent属性,“helloIndia”bean已被定义为“helloWorld”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.breakyizhan.HelloWorld">
      <property name = "message1" value = "Hello World!"/>
      <property name = "message2" value = "Hello Second World!"/>
   </bean>
 
   <bean id =" helloIndia" class = "com.breakyizhan.HelloIndia" parent = "helloWorld">
      <property name = "message1" value = "Hello India!"/>
      <property name = "message3" value = "Namaste India!"/>
   </bean>
</beans>

这里是HelloWorld.java文件的内容-

package com.breakyizhan;
 
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.breakyizhan;
 
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.breakyizhan;
 
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!

如果您在这里观察到,我们在创建“helloIndia”bean时没有传递message2,但由于Bean定义继承而通过。

Bean定义模板

您可以创建一个Bean定义模板,该模板可以被其他子bean定义使用,而不需要付出太多努力。在定义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.breakyizhan.HelloIndia" parent = "beanTeamplate">
      <property name = "message1" value = "Hello India!"/>
      <property name = "message3" value = "Namaste India!"/>
   </bean>
    
</beans>

父bean不能自行实例化,因为它是不完整的,并且它也明确标记为抽象。当定义像这样抽象时,它只能用作纯模板bean定义,作为子定义的父定义。

  •   本文标题:Spring框架:Bean定义继承 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/3135.html

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读