Spring Bean 定义继承

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

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

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

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

2.实例

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

步骤 描述

1    创建一个名称为 SpringExample 的项目,并且在创建项目的 src 文件夹中创建一个包 com.xxkt。
2   使用 Add External JARs 选项,添加所需的 Spring 库,解释见 Spring Hello World Example 章节。
3   在 com.xxkt 包中创建 Java 类 HelloWorld、HelloIndia 和 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.xxkt.HelloWorld"><property name="message1" value="Hello World!"/><property name="message2" value="Hello Second World!"/></bean><bean id="helloIndia" class="com.xxkt.HelloIndia" parent="helloWorld"><property name="message1" value="Hello India!"/><property name="message3" value="Namaste India!"/></bean></beans>

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

package com.xxkt;
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.xxkt;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.xxkt;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.xxkt.HelloIndia" parent="beanTeamplate"><property name="message1" value="Hello India!"/><property name="message3" value="Namaste India!"/></bean></beans>

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

【Spring】Spring Bean 定义继承相关推荐

  1. Spring Bean 定义继承

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

  2. Spring的bean定义 2 : 通用bean定义逻辑 -- AbstractBeanDefinition

    概述 AbstractBeanDefinition是最终全功能BeanDefinition实现类的基类,也就是这些类的共同属性和公共逻辑实现. AbstractBeanDefinition中并没有太复 ...

  3. 品Spring:bean定义上梁山

    技术不枯燥,先来点闲聊 先说点好事高兴一下.前段时间看新闻说,我国正式的空间站建设已在进行当中.下半年,长征五号B运载火箭将在海南文昌航天发射场择机将空间站核心舱发射升空.预计用2到3年将空间站建好. ...

  4. spring的bean定义真的和顺序无关?

    http://narcissusoyf.iteye.com/blog/705511 在使用Ibatis的时候,如果某个sql的定义出现在引用sql的定义之后的话,笨笨的ibatis是会报错的..这让用 ...

  5. Spring中Bean定义的注册流程

    目录 一.前言 二.Bean定义的注册流程 1.注册流程 2.SpringApplication组件 2.1.run()核心逻辑

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

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

  7. Spring中Bean的定义继承

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

  8. 标签系列二:spring 中bean解释以及bean标签里面的属性

    一.bean标签: 英文解释:Defines a single (usually named) bean. A bean definition may contain nested tags for ...

  9. Spring Boot: Bean definition overriding

    在本文中,我将讨论棘手的Spring Boot bean定义覆盖机制. 为了使您对该主题更加清楚,让我们从小测验开始.请看下一个简单的例子. 因此,我们有2种配置,它们使用名称beanName实例化b ...

最新文章

  1. java为啥要捕捉异常_java – 为什么在捕获时使用IOexception而不是Exception?
  2. Windows下Unity5x的安装
  3. 人体姿态估计论文总结 (2D + 视频)
  4. 移动机器人平台-ROS和GitHub链接
  5. php mysql文件缓存_PHP文件缓存类实现代码
  6. 异步IO\数据库\队列\缓存
  7. python共享文件权限_利用Python实现在同一网络中的本地文件共享方法
  8. php如何求同列元素之和_求得这个数组中各个元素之和
  9. UE4多线程任务系统详解
  10. 图片渲染延迟_2D Canvas 的渲染优化
  11. Linux下如何从普通用户切换到root用户
  12. Android实现本地推送通知的解决方案
  13. OpenGL实现B样条曲线
  14. Web The7安装
  15. 大师速写作品及理论,有你喜欢的知识
  16. Oracle EBS APP-FND-02901: you don‘t have privilege to any operating unit
  17. java常见单词汇总3(非常使用哦)
  18. 如何用 ffmpeg命令将avi视频转换为mp4
  19. 2020年11月软件设计师真题透析
  20. Ae安装时出现(此时无法安装错误代码127) 怎么办?

热门文章

  1. 此“小霸王”非彼小霸王?官方声明:小霸王并未破产!
  2. 腾讯云与阿里云竞争激烈:销售团队积极争取每一笔交易
  3. 余额宝上线新功能,可以跟亲朋好友一起攒钱了
  4. 罗永浩直播又翻车?网友吐槽半价车是黑幕,本人回应
  5. “宅家十大热销商品”榜单:确认过眼神,都是自己剪头发的人
  6. 王思聪又双被限制消费了!
  7. 搜狐提出畅游私有化要约 后者收盘涨近50%
  8. 为真全面屏探路?2019款新iPhone将采用超小前置摄像头
  9. 华为P30系列机身侧面照曝光 摄像头仍然“凸起”...
  10. 从开场白第一句到得分