在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. 机器学习笔记(十六)强化学习
  2. c语言编写经验逐步积累3
  3. 全网首发 PowerBI 秒级实时大屏通用解决方案
  4. 使用Oracle WebLogic对应用程序外部的EJB的引用
  5. python语言的类型是_Python的语言类型
  6. 【原创】asp.net静态页面生成方案
  7. 遗传算法原理及应用二(交叉算子、变异算子与运行参数选择)
  8. 【学术相关】明尼苏达大学博导“约法十章”火了:没事不乱开会、合写论文不要催导师,复旦教授直呼值得学习...
  9. Windows server 2003 安装步骤
  10. 关于“Connection refused: connect”错误
  11. 营改增后计算机维修费税率,2020国税维修费税率是多少?
  12. 借助近距离通信,实现手机作为游戏控制器掌控大屏游戏
  13. 燕十八mysql基础复习
  14. 自定义控件其实很简单2/12
  15. Unity 用于投掷物品的一阶贝塞尔曲线
  16. Python就业前景怎么样
  17. 牛奶可乐经济学之Q1:为什么牛奶装在方盒子里卖,可乐却装在圆瓶子里卖?
  18. 折现分割平面(递推)
  19. SAP ABAP ALV 的一些总结:Docking container 和 Dialogbox container
  20. 2019南京帆软春招

热门文章

  1. 新旧电脑安装win11系统【超简单教程】
  2. Source Insight 使用
  3. [七夕节]——一款基于canvas绘制五颜六色线条合成一个爱心发光动画特效
  4. 海量用户即时通讯系统
  5. linux中mv、cp、rm分别是什么意思
  6. 苹果计算机密码bug,苹果iOS 13系统新BUG:快速输入密码,解锁无效
  7. 学会个人管理和自我管理必看的书籍推荐
  8. 4hutool源码分析:DateUtil(时间工具类)-格式化时间(万字长文源码分析,学大佬如何写代码)
  9. Kafka High Level API vs. Low Level API
  10. 『关键词挖掘』结合 LDA + Word2Vec + TextRank 实现关键词的挖掘