转载自  Spring Bean 定义继承

Bean 定义继承

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

子 bean 的定义继承父定义的配置数据。子定义可以根据需要重写一些值,或者添加其他值。

Spring Bean 定义的继承与 Java 类的继承无关,但是继承的概念是一样的。你可以定义一个父 bean 的定义作为模板和其他子 bean 就可以从父 bean 中继承所需的配置。

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

例子

我们在适当的位置使用 Eclipse IDE,然后按照下面的步骤来创建一个 Spring 应用程序:

步骤 描述
1 创建一个名称为 SpringExample 的项目,并且在创建项目的 src 文件夹中创建一个包 com.tutorialspoint
2 使用 Add External JARs 选项,添加所需的 Spring 库,解释见 Spring Hello World Example 章节。
3 在 com.tutorialspoint 包中创建 Java 类 HelloWorldHelloIndia 和 MainApp
4 在 src 文件夹中创建 Beans 配置文件 Beans.xml
5 最后一步是创建的所有 Java 文件和 Bean 配置文件的内容,并运行应用程序,解释如下所示。

下面是配置文件 Beans.xml,在该配置文件中我们定义有两个属性 message1 和 message2 的 “helloWorld” bean。然后,使用 parent 属性把 “helloIndia” bean 定义为 “helloWorld” bean 的孩子。这个子 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/beanshttp://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>

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

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

这里是 HelloIndia.java 文件的内容:

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

下面是 MainApp.java 文件的内容:

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

一旦你创建源代码和 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 定义的继承,所以它传递了 message2。

Bean 定义模板

你可以创建一个 Bean 定义模板,不需要花太多功夫它就可以被其他子 bean 定义使用。在定义一个 Bean 定义模板时,你不应该指定的属性,而应该指定带 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/beanshttp://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>

父 bean 自身不能被实例化,因为它是不完整的,而且它也被明确地标记为抽象的。当一个定义是抽象的,它仅仅作为一个纯粹的模板 bean 定义来使用的,充当子定义的父定义使用。

Spring Bean 定义继承相关推荐

  1. 【Spring】Spring Bean 定义继承

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

  2. Spring bean配置继承

    在 Spring,继承是用为支持bean设置一个 bean 来分享共同的值,属性或配置. 一个子 bean 或继承的bean可以继承其父 bean 的配置,属性和一些属性.另外,子 Bean 允许覆盖 ...

  3. Spring Bean的继承

    bean 定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名,等等. 子 bean 的定义继承父定义的配置数据.子定义可以根据需要重写一些值,或者添加 ...

  4. Spring Bean 定义

    转载自   Spring Bean 定义 Bean 定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring I ...

  5. bean定义的继承 - Spring Framework reference 2.0.5 参考手册中文版

    http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s06.html 3.6. bean定义的继承 在bean定义中包含了大量的 ...

  6. Spring中Bean的定义继承

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-definition-inheritance.html: Bean定义继承 bean定义可 ...

  7. Spring教程——Spring Bean继承

    在 Spring 中,Bean 和 Bean 之间也存在继承关系.我们将被继承的 Bean 称为父 Bean,将继承父 Bean 配置信息的 Bean 称为子 Bean. Spring Bean 的定 ...

  8. Spring-Boot 2.1.x和主要的bean定义

    我最近将应用程序从Spring Boot 1.5.X迁移到Spring Boot 2.X ,发现覆盖Spring Bean定义存在问题. 其中一种配置是在Kotlin中遵循的: @Configurat ...

  9. Spring Bean详解

    Spring bean是Spring框架在运行时管理的对象.Spring bean是任何Spring应用程序的基本构建块.你编写的大多数应用程序逻辑代码都将放在Spring bean中. Spring ...

最新文章

  1. 刷爆 AI 圈!基于 Transformer 的 DALL-E 代码刚刚开源了
  2. 忘记Mysql的root密码怎么办
  3. hdu 2074 叠框
  4. centos 安装配置ftp服务器
  5. Nordic Collegiate Programming Contest (NCPC) 2016
  6. 吴裕雄--天生自然 高等数学学习:空间直角坐标系
  7. [转载] python跨行 print:多用(),换行符\要小心,少用+或者不用(其它程序代码跨行用\就行,不能用括号)
  8. java数据结构编程问题_Java语言程序设计与数据结构第十一版(基础篇)第一章编程练习题答案...
  9. mapgis67安装输入计算机名称,mapgis67_dogserver67.exe_mapgis67安装教程
  10. 【网络流24题-23】洛谷P3356 火星探险问题
  11. 20个免费的SEO网站分析工具
  12. 孙悟空的成长历程想到的
  13. 自组织(竞争型)神经网络
  14. 2.1 良好的代码格式
  15. How to GROUD?
  16. lua 报错:'=' expected near ' '
  17. 未来的城市:智慧城市定义、特征、应用、场景
  18. Kissy中的ajax异步提交
  19. linux硬盘可以拆吗,笔记本电脑硬盘拆下来,然后把移动硬盘也拆了,现在把移动硬盘安在笔记本上了,并安装了Linux系统...
  20. Mybatis 中的一级缓存与二级缓存

热门文章

  1. [C++11]forward完美转发
  2. LeetCode 82 删除排序链表中的重复元素||-中等
  3. hash table(用乘法散列法实现)
  4. 二叉搜索树(创建,插入,删除):基础篇,适合新手观看。
  5. src获取同级目录中的图片_一个简单的Python爬虫实例:百度贴吧页面下载图片
  6. LeetCode动态规划 最大子序和
  7. B. Lynyrd Skynyrd(倍增 + 区间最小值)
  8. Be the Winner(结论:反nim博弈)
  9. P5488 差分与前缀和(多项式/生成函数)
  10. HDU - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?! 莫队/单调栈 + 线段树/ST表在线