在Spring官方文档的描述中,如果一个Bean A依赖另外一个Bean B,那么在IOC容器初始化两个Bean时,首先会初始化被依赖的Bean B,再初始化依赖Bean A.

我们来看实例:

假如有两个Bean,一个是Bean我们命名为car,另外一个命名为carrey, carrey依赖car。

car.java

/**
* @Comment
* @Author Ron
* @date 2016年9月23日 上午9:59:53
*/
public class car {
public car(){
System.out.println("I'm a car.");
}
}

carrey.java

/**
* @Comment
* @Author Ron
* @date 2016年9月23日 上午10:01:40
*/
public class carrey {
private car car;
public carrey() {
System.out.println("I'm a carrey car.");
}
public car getCar() {
return car;
}
public void setCar(car car) {
this.car = car;
}
}

测试类main.java

/**
* @Comment
* @Author Ron
* @date 2016年9月23日 上午9:47:12
*/
public class Main {
public static void main(String[] args) {
ApplicationContext apc = new ClassPathXmlApplicationContext("springXML/test.xml");
carrey carrey = apc.getBean("carrey",carrey.class);
}
}

首先,我们不使用depends-on属性,按照通常情况下的配置方法来配置两个bean的依赖关系

1、将被依赖的Bean car配置到依赖Bean carrey之前

<?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:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="learn.car" id="car"></bean>
<bean class="learn.carrey" id="carrey">
<property name="car" ref="car" />
</bean>
</beans>

运行结果

I'm a car.
I'm a carrey car.
2、将被依赖的Bean car配置到依赖Bean carrey之后

<?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:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="learn.carrey" id="carrey">
<property name="car" ref="car" />
</bean>
<bean class="learn.car" id="car"></bean>
</beans>

运行结果

I'm a carrey car.
I'm a car.

为什么会出现以上不同的运行结果呢???官方文档不是说,如果一个Bean A依赖另外一个Bean B,那么在IOC容器初始化两个Bean时,首先会初始化被依赖的Bean B,再初始化依赖Bean A吗?后来查了一下,原因是IOC容器在初始化单例Bean时,优先按照Bean的配置顺序初始化,如果两个相互依赖的Bean在初始化时,依赖Bean A的初始化之前需要强制先初始化被依赖的Bean B,这时就需要用到depends-on属性了。

对于以下两种配置,IOC容器首先都会初始化car,再初始化 carrey

<?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:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="learn.car" id="car"></bean>
<bean class="learn.carrey" id="carrey" depends-on="car">
<property name="car" ref="car" />
</bean>
</beans>
<?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:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="learn.carrey" id="carrey" depends-on="car">
<property name="car" ref="car" />
</bean>
<bean class="learn.car" id="car"></bean>
</beans>

运行结果:

I'm a car.
I'm a carrey car.

3、使用depends-on的好处

在一些特殊情况下,Bean初始化时需要调用一些静态的初始化程序,在特殊情况下,这些被调用的静态初始化程序的值是通过被依赖的Bean设置的,比如我们以上的所举的car和carrey,carrey依赖car,在carrey初始化时我们需要打印引擎名称(Engine Name),但是引擎名称我们是在car中设置的,同时引擎名称是引擎类(Engine)中的一个静态属性engname

Engine.java

/**
* @Comment
* @Author Ron
* @date 2016年9月23日 上午11:08:29
*/
public class Engine {
private static String engname;
public static String getEngname() {
return engname;
}
public static void setEngname(String engname) {
Engine.engname = engname;
}

car.java

/**
* @Comment
* @Author Ron
* @date 2016年9月23日 上午9:59:53
*/
public class car {
public car(){
System.out.println("I'm a car.");
Engine.setEngname("Ron");
}
}

carrey.java

/**
* @Comment
* @Author Ron
* @date 2016年9月23日 上午10:01:40
*/
public class carrey {
private car car;
public carrey() {
System.out.println("I'm a carrey car.");
System.out.println("Engine Name-->"+Engine.getEngname());
}
public car getCar() {
return car;
}
public void setCar(car car) {
this.car = car;
}
}

如果不使用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"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="learn.carrey" id="carrey">
<property name="car" ref="car" />
</bean>
<bean class="learn.car" id="car"></bean>
</beans>

 运行结果

I'm a carrey car.
Engine Name-->null
I'm a car.

使用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"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="learn.carrey" id="carrey" depends-on="car">
<property name="car" ref="car" />
</bean>
<bean class="learn.car" id="car"></bean>
</beans>

 运行结果:

I'm a car.
I'm a carrey car.
Engine Name-->Ron

转载于:https://www.cnblogs.com/Ron-Zheng/p/5899326.html

Spring 使用 ref 和 depends-on 属性的使用相关推荐

  1. Spring中ref local与ref bean区别

    为什么80%的码农都做不了架构师?>>>    Spring中ref local与ref bean区别 今天在做SSH框架Demo实例时,在ApplicationResources. ...

  2. Spring中的Bean配置、属性配置、装配内容详细叙述

    文章目录 1.Bean的配置 1.1.配置方式 2.Bean的实例化 2.1.构造器实例化 2.2.静态工厂方式实例化 2.3.实例工厂方式实例化 3.Bean的作用域 3.1.作用域的种类 4.Be ...

  3. Spring Bean的配置及常用属性

    作为 Spring 核心机制的依赖注入,改变了传统的编程习惯,对组件的实例化不再由应用程序完成,转而交由 Spring 容器完成,在需要时注入应用程序中,从而对组件之间依赖关系进行了解耦.这一切都离不 ...

  4. Spring——Bean管理-xml方式进行属性注入

    目录 一.xml方式创建对象 二.xml方式注入属性 第①种方式注入:set方法注入 第②种方式注入:有参构造函数注入 constructor-arg:通过构造函数注入 用name标签属性: 不按照顺 ...

  5. spring boot通过命令行配置属性

    spring boot通过命令行配置属性 命令:java -jar xxx.jar --server.port=8888,通过使用–-server.port属性来设置xxx.jar应用的端口为8888 ...

  6. Spring框架中XML配置特殊属性注入

    Spring框架中XML配置特殊属性注入 前言 创建测试类 其他类型属性 前言 Spring框架中,在通过set方式进行属性注入时,可能会遇到某些特殊字符的注入,例如:null和某些标签字符" ...

  7. Flowable 6.6.0 BPMN用户指南 - (5)Spring Boot - 5.8 Flowable应用属性

    Flowable 6.6.0 用户指南相关文档下载 BPMN用户指南 第一部分 - 中文PDF精编版 BPMN用户指南 第二部分 - 中文PDF精编版 BPMN用户指南 第三部分 - 中文PDF精编版 ...

  8. spring配置中id和name属性的区别

    可能大家在网上都应该搜索过在 Spring 配置中 id 和 name 属性的区别,可能你会搜索到有一大堆的区别,不过在我这里可能不一样了. 我这里 Spring 的版本为 3.2.4,区别不是很大, ...

  9. 根据Spring上下文对象xxxContext获得*.properties属性文件中的配置属性值

    最近写了一个文件上传和下载的简单测试demo,对于这种需要部署在服务器上的,而不是随便在本机上跑跑的那种,对于上传和下载的目录路径的选择和配置尤为重要,这个不能在代码里面写死,必须是灵活可配置的. 一 ...

最新文章

  1. JavaScript系列-(原型-原型连-call-apply-继承)
  2. jupyter 多个python版本
  3. 高并发缓存处理之——缓存穿透的几种形式及解决方案
  4. 不到200行代码实现一个不断旋转的椭圆动画效果
  5. LoadRunner 技巧之THML 与 URL两种录制模式分析
  6. 【读书笔记0101】Beginning linux programming-3rd
  7. matlab自家自减,【求助】VC环境下自增(++)自减(--) - 信息科学 - 小木虫 - 学术 科研 互动社区...
  8. 《CCNP ROUTE 300-101认证考试指南》——2.10节 复习所有考试要点
  9. Hadoop作业提交多种方案具体流程详解
  10. 安装Oracle驱动ojdbc8到本地maven仓库
  11. eplan 2.7安装过程中multikey黄色感叹号解决办法
  12. 操作 神通数据库_神通数据库安装及操作笔记
  13. 电脑蓝牙耳机无法调节用关闭绝对音量来解决
  14. java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
  15. 电脑桌面便签小工具哪款免费又好用
  16. 北京大学计算机研究生怎么样,北京大学计算机专业在职研究生怎么样?
  17. 粉丝福利 | 秒 get 支付宝同款扫码组件
  18. 【文献阅读2】Cytological and transcriptome analyses reveal abrupt gene expression for meiosis and sacchari
  19. java实现回文数算法
  20. Linux-命令:ll命令报错-bash: ll: command not found

热门文章

  1. android edittext背景颜色,Android 设置 EditText 背景颜色、背景图片
  2. vs2008 项目类型设置
  3. C#在vs中吧数据流直接打印到txt文件
  4. excel根据颜色赋值 Excel填充颜色单元格替换成数字 excel把所有红色变成1
  5. win10睡眠状态下唤醒花屏
  6. 【JavaScript】相关知识学习笔记
  7. 微信公众号(测试号)消息模板推送
  8. 如何使用报表工具设置页眉与页脚
  9. 2个大厂 100亿级 超大流量 红包 架构方案
  10. android usb 流程