• 概述
  • 继承
    • 实例
  • 依赖
    • 实例
  • 引用
    • 实例
  • 总结

概述

不但可以通过<ref>引用另外一个bean,建立起Bean和Bean之间的依赖关系, bean元素标签之间也可以建立类似的关系,完成一些特殊的功能。

在Spring容器中,两个Bean之间 除了注入关系外,还存在 继承、依赖、引用 三种关系:

  • 继承关系:在Spring容器当中允许使用abstract标签来定义一个父bean,parent标签来定义一个子bean。子bean将自动继承父bean的配置信息。

  • 依赖关系:Spring允许用户通过depends-on标签来设定bean的前置依赖bean,前置依赖的bean会在本bean实例化之前创建好,供本bean使用。

  • 引用关系:不光可以通过ref标签来引用其他的bean,而且可以通过idref标签来引用其他bean的名字。它的主要作用是:在Spring容器启动的时候就可以检查引用关系的正确性,从而可以提前发现配置信息是否存在错误。


继承

如果多个bean存在相同的配置信息,Spring允许定义一个父Bean,子bean将自动继承父bean的配置信息。

Spring会将父bean的配置信息传递个子bean,如果子bean提供了父bean已有的配置信息,那么子bean的配置信息将覆盖父bean的配置信息。

父bean的功能主要是简化子bean的配置,所以一般声明为 abstract=”true”, 标识这个bean不会被实例化为一个对应的bean。

实例

POJO

package com.xgj.ioc.beansRelation.extend;public class Plane {private String brand;private String color;private int speed;public void setBrand(String brand) {this.brand = brand;}public void setColor(String color) {this.color = color;}public void setSpeed(int speed) {this.speed = speed;}public void introduce() {System.out.println("brand:" + brand + ",speed:" + speed + ",color:"+ color);}
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--<bean id="planeOne" class="com.xgj.ioc.beansRelation.extend.Plane"p:brand="F35" p:speed="1200" p:color="white"/><bean id="planeTwo" class="com.xgj.ioc.beansRelation.extend.Plane"p:brand="F35" p:speed="1200" p:color="blue"/>--><bean id="abstractPlane" class="com.xgj.ioc.beansRelation.extend.Plane" abstract="true"p:brand="F35" p:speed="1200" p:color="default"/><bean id="planeOne" parent="abstractPlane" p:color="white"/><bean id="planeTwo" parent="abstractPlane" p:color="blue"/></beans>

测试类

package com.xgj.ioc.beansRelation.extend;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeansExtendTest {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/ioc/beansRelation/extend/beans.xml");ctx.getBean("planeOne", Plane.class).introduce();ctx.getBean("planeTwo", Plane.class).introduce();}}

运行结果

可以看到这两个bean都继承自abstractPlane这个父bean,在上面的代码中子bean就只改变了color属性,其他属性都跟父类相同。


依赖

在Spring容器中,当使用depends-on标签建立对其他Bean的依赖关系时,Spring容器负责管理这些Bean的关系,当实例化一个Bean时,容器保证该Bean所依赖的Bean已经初始化;如果前置依赖多个Bean,可以通过逗号或空格方式配置Bean名称。

实例

举个例子:

在某论坛系统当中,具有很多的启动参数,比如:会话过期时间、缓存更新时间等。这些启动参数用来控制系统的运行逻辑,我们使用一个SystemSetting类来表示这些参数。

package com.xgj.ioc.beansRelation.depend;public class SystemSetting {public static int SESSION_TIMEOUT = 30;public static int REFRESH_CYCLE = 60;}

在这里我们定义了两个系统参数,我们这里直接定义了这两个参数的值,但在真正的论坛系统当中这些值应该是可以动态设置的,并及时保存到后台数据库当中。在系统启动时,初始化程序来从后台数据库获取这些系统参数的配置值以覆盖默认的值。 在这里我们模拟从数据库中加载系统值。

package com.xgj.ioc.beansRelation.depend;public class SysInit {public SysInit() {SystemSetting.SESSION_TIMEOUT = 10;SystemSetting.REFRESH_CYCLE = 100;}}

假设我们的系统需要一个缓存刷新管理器,他需要根据SystemSettings.REFRESH_CYCLE 的值来创建缓存定时刷新任务,那么请看如下 的代码:

package com.xgj.ioc.beansRelation.depend;import java.util.Timer;
import java.util.TimerTask;public class CacheManager {public CacheManager() {Timer timer = new Timer();TimerTask cacheTask = new CacheTask();System.out.println("SystemSetting.REFRESH_CYCLE:"+ SystemSetting.REFRESH_CYCLE);timer.schedule(cacheTask, 0, SystemSetting.REFRESH_CYCLE);}}
package com.xgj.ioc.beansRelation.depend;import java.util.TimerTask;public class CacheTask extends TimerTask {@Overridepublic void run() {try {// bussiness logicSystem.out.println("bussiness run");Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}

从上面的代码中可以看出 CacheManager依赖与SystemSetting,而SystemSetting又依赖与SysInit。 可以看到SysInit必须首先执行然后才能执行接下来的代码。 如果这三个bean都在Spring当中定义,那么我们该如何保证SysInit bean被首先执行呢? 那么就得使用depends-on属性标签了

<?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.xsd"><bean id="cacheManager" class="com.xgj.ioc.beansRelation.depend.CacheManager"depends-on="sysInit"/><bean id="sysInit" class="com.xgj.ioc.beansRelation.depend.SysInit"/>
</beans>

测试类

package com.xgj.ioc.beansRelation.depend;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeansDependTest {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/ioc/beansRelation/depend/beans.xml");}
}

运行结果


引用

在Spring容器中,当使用<ref>标签引用另外一个Bean时,但实际上两者并没有建立引用关系,即使我们编写错误,也需要在运行期才可以发现。 因此Spring提供了<idref>元素标签,通过<idref>引用另一个Bean的名字,可以在容器启动的时候,检查引用关系的正确性,这样可以提前发现错误的配置信息

实例

POJO

package com.xgj.ioc.beansRelation.reference;public class Pilot {private String planeId;public String getPlaneId() {return planeId;}public void setPlaneId(String planeId) {this.planeId = planeId;}@Overridepublic String toString() {System.out.println("*********" + getPlaneId());return "planeId:" + getPlaneId();}
}

POJO

package com.xgj.ioc.beansRelation.reference;public class Plane {}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- <bean>引用 --><bean id="pilot" class="com.xgj.ioc.beansRelation.reference.Pilot" ><property name="planeId" ><idref bean="plane"/></property></bean><bean id="plane" class="com.xgj.ioc.beansRelation.reference.Plane"/></beans>

测试类

package com.xgj.ioc.beansRelation.reference;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeansRefTest {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/ioc/beansRelation/reference/beans.xml");Pilot pilot = ctx.getBean("pilot", Pilot.class);pilot.setPlaneId("99");pilot.toString();}
}

运行结果


总结

Spring为bean提供了一系列的关系:注入、继承、依赖、引用 使用bean之间的关系可以将代码中繁琐的类间关系转移到配置文件当中来,降低了代码的耦合性,也方便系统的模块化管理。


Spring-bean之间的关系相关推荐

  1. 峰Spring4学习(5)bean之间的关系和bean的作用范围

    一.bean之间的关系: 1)继承: People.java实体类: package com.cy.entity;public class People {private int id;private ...

  2. J2EE高级开发框架小课程之Spring框架2——Spring容器作用域,生命周期,Spring管理对象之间依赖关系

    Spring容器作用域 Spring创建对象的作用域:Spring在创建对象时,默认只创建一个(单例模式) scope: singleton(默认 单例) 构造器就一次,结果true prototyp ...

  3. IOC之bean之间的关系讲解

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文主要讲了Spring中Bean之间的关系,分为继承.依赖和引用三个类型.文章中都分别有例子 ...

  4. XML配置里的Bean自动装配与Bean之间的关系

    需要在<bean>的autowire属性里指定自动装配的模式 byType(根据类型自动装配) byName(根据名称自动装配) constructor(通过构造器自动装配) 名字须与属性 ...

  5. spring--(14)利用注解建立bean与bean之间的关系

    2019独角兽企业重金招聘Python工程师标准>>> xml配置文件 <!-- 扫描com.test.annotation包下所有的类 --><context:c ...

  6. Spring各模块的功能及互相之间的关系

    目录 spring-framework 的源码目录 Spring FrameWork 结构图 各个模块功能(该部分参考结构图来看) 模块概述(该部分参考源码目录来看) 核心容器 AOP和Instrum ...

  7. 原创 | 一文了解那些和Spring Bean有关的那些注解!

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 220 篇原创分享 作者 l cxuan 来源 l Hollis(ID:hollischuang) 随着Spring的流行 ...

  8. Spring (Bean, IoC, AOP, SpringMVC)

    Spring - Bean, IoC, AOP, SpringMVC Spring 1. 核心容器 1.1 Spring-beans 1.1.1 Bean 的配置 1.1.1.1 自动装配 1.1.1 ...

  9. 4、IOC 之Bean的依赖关系

    4.IOC 之Bean的依赖关系 4.1.依赖注入(DI) 依赖关系注入 (DI) 是一个过程,其中对象仅通过构造函数参数.工厂方法的参数或在对象实例构造或从工厂方法返回后在对象实例上设置的属性来定义 ...

最新文章

  1. Kubeedge Edged概述
  2. 请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。...
  3. pytorch 指定层学习率
  4. 简易linux修改ip,让Linux修改IP、DNS等可以更简单
  5. 数据库中的范式和反范式详解!
  6. java8 例外网站_Java8兰巴达斯和例外
  7. 使用XStream进行对象和xml的转换,极度舒适
  8. jsjq面试笔记(下)
  9. 0427千里之行,始于足下
  10. 斯坦福大学NLP课程CS224N课第一次作业第一部分
  11. 泛微平台ecology8.0二进制文件流下载对接接口
  12. 宅急送BOS系统软硬件集成方案goldengate(一)
  13. Ember学习(1):Ember核心概念
  14. B代表哪一种氨基酸?B和b代表的氨基酸一样吗?
  15. Lingo练习 选拔问题
  16. 新零售运营独白,如何联合线上线下
  17. Android 仿美团选择城市、微信通讯录、饿了么点餐列表的导航悬停分组索引列表
  18. stm32cube,hal库来实现PS2手柄数据发送
  19. modbus调试团结_教学团结? 为教育者免费提供丰富的课程资源
  20. JavaScript 常见的设计模式

热门文章

  1. python将图像转换为8位单通道_【图像处理】OpenCV系列三十五--- equalizeHist函数详解...
  2. bagging 与boosting
  3. python浮点数运算问题_python基础教程之. 浮点数运算:问题和局限
  4. 将单链表的每K个节点之间逆序
  5. 点云网络的论文理解(四)-点云网络的优化 PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
  6. 算法解密:电梯是如何实现上下调度的?
  7. 听说你想去大厂看妹子,带你看看腾讯产品运营实习面经
  8. 本地maven仓库_Maven(四):仓库
  9. Python3--批量爬取数据之调用有道api进行翻译
  10. arcgis-“一个或多个已经添加图层的范围与关联空间参考不一致”“Arcmap不能绘制一个或者多个图层”