zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Spring Bean的继承

2023-09-14 09:03:08 时间

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

子 bean 的定义继承父定义的配置数据。子定义可以根据需要重写一些值,或者添加其他值。
Spring Bean 定义的继承与 Java 类的继承无关,但是继承的概念是一样的。你可以定义一个父 bean 的定义作为模板和其他子 bean 就可以从父 bean 中继承所需的配置。

当你使用基于 XML 的配置元数据时,通过使用父属性,指定父 bean 作为该属性的值来表明子 bean 的定义。

看个例子:

创建一个POJO,包含两个属性message1和message2.

package com.sap;

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, 这个类和HelloWorld没有任何继承关系上的关联:

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

bean.xml:

<?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="helloWorldJerry" class="com.sap.HelloWorld">
      <property name="message1" value="Hello World!"/>
      <property name="message2" value="Hello Second World!"/>
   </bean>

   <bean id="helloIndia" class="com.sap.HelloIndia" parent="helloWorldJerry">
      <property name="message1" value="Hello India!"/>
      <property name="message3" value="Namaste India!"/>
   </bean>
</beans>

HelloWorld通过beans.xml注入了属性message1和message2,HelloIndia注入了属性message1和message3:

MainApp.java:

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("helloWorldJerry");

      objA.getMessage1();
      objA.getMessage2();

      HelloIndia objB = (HelloIndia) context.getBean("helloIndia");
      objB.getMessage1();
      objB.getMessage2();
      objB.getMessage3();
   }
}

输出:

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

我们可以观察到,对于helloIndia,虽然我们没有在beans.xml里注入属性message2,但其仍然从parent bean即helloworld里继承了message2的属性值。

bean的parent除了是另一个bean外,也可以是一个模板(template),比如:

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

要获取更多Jerry的原创文章,请关注公众号"汪子熙":