Bean 的 depends-on 属性

前言

今天下午在复习 Spring Bean 相关知识的时候突然一个新的东东进入了我的认知世界,他就是……

!!depends-on !!

NM这是啥!

不是有 ref 了吗!!

这干吗用的啊!!!

平静下来之后,我进行了网上冲浪。于是就有了下文……

一、depends-on 究竟是啥?

首先放上官方文档描述:

If a bean is a dependency of another that usually means that one bean is set as a property of another. Typically you accomplish this with the element in XML-based configuration metadata. However, sometimes dependencies between beans are less direct; for example, a static initializer in a class needs to be triggered, such as database driver registration. The depends-on attribute can explicitly force one or more beans to be initialized before the bean using this element is initialized.

如果一个bean是另一个bean的依赖项,通常意味着将一个bean设置为另一个bean的属性。 通常,您可以使用基于XML的配置元数据中的标签来完成此操作。 但是,有时bean之间的依赖性不太直接。 比方说,需要触发类中的静态初始化器,例如数据库驱动程序注册。 depends-on 属性可以显式地强制初始化一个或多个使用该元素的bean之前的bean。

depends-onref 属性都可以作为一个 bean 依赖另一个 bean 的属性

且依赖会使被依赖项先于依赖项进行初始化,而后于依赖项被销毁。 举个栗子:

先写好 Person.java 以及 Phone.java(Getter and Setter 、toString 这里就不写啦)

// Person.javapublic class Person {private String name;private int age;private Phone phone;public Person() {System.out.println("Person 被实例化了!");}public void init() {System.out.println("Person 被初始化了!");}public void destroy() {System.out.println("Person 被销毁了!");}
}
// Phone.javapublic class Phone {private String brand;private String model;private int price;public Phone() {System.out.println("Phone 被实例化了!");}public void init() {System.out.println("Phone 被初始化了!");}public void destroy() {System.out.println("Phone 被销毁了!");}
}

定义好两个类之后开始配置 beans(在这里配置 depends-on 或者 ref 属性)

<!-- beans-relation.xml --><!-- Phone bean 定义 -->
<bean id="phone_0" class="indi.homn.relation.Phone"p:brand="HUAWEI" p:model="Mate30 Pro" p:price="6899"init-method="init" destroy-method="destroy"/>
<!-- Person bean 定义 -->
<bean id="person_0" class="indi.homn.relation.Person"p:name="xxx" p:age="10" depens-on="phone_0"  <!-- depends-on 属性在这里 -->init-method="init" destroy-method="destroy"/>

配置好 beans 之后写测试程序

// Main.java//打开容器,并且实例化容器中的 beans
AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans-relation.xml");//关闭容器,并且销毁容器中的 beans
context.registerShutdownHook();

运行看看输出了什么

// OutputPhone 被实例化了!
Phone 被初始化了!     <-- 被依赖项 Phone 先初始化
Person 被实例化了!
Person 被初始化了!
Person 被销毁了!
Phone 被销毁了!       <-- 被依赖项 Phone 后被销毁

(只有 scope 属性为 singleton 的 bean 才会被销毁,prototype 不可以。bean 配置 scope 默认为 singleton)

beans-relation.xml 文件中的 depends-on 换成 ref 得出的结果是一样的,这里不做演示。

那他们有什么区别?当然有!请接下来看。

二、与 ref 属性的区别

1. 代码执行顺序

一开始还以为是将 Phone bean 定义在 Person bean 之前的关系,于是我调换了他们的顺序

<!-- beans-relation.xml --><!-- Person bean 定义 -->
<bean id="person_0" class="indi.homn.relation.Person"p:name="xxx" p:age="10" depens-on="phone_0"init-method="init" destroy-method="destroy"/><!-- Phone bean 定义 -->
<bean id="phone_0" class="indi.homn.relation.Phone"p:brand="HUAWEI" p:model="Mate30 Pro" p:price="6899"init-method="init" destroy-method="destroy"/>

结果还是和上面说的一样,于是我将 depands-on 换成了 ref 属性又试了一下。

MASAKA!!! 也会一样吗!!!

// OutputPerson 被实例化了!    <-- 依赖项 Person 先被实例化
Phone 被实例化了!
Phone 被初始化了!     <--
Person 被初始化了!
Person 被销毁了!
Phone 被销毁了!       <-- 被依赖项 Phone 后被销毁

打扰了

依赖项 Person 先被实例化了!奇怪的知识增加了!!!

这里应该有小伙伴们都要问了:不是说好被依赖项先的吗!?

确实,不过这里的 “先” 指的不是实例化,而是初始化。 我们看上面输出的第二个箭头(<–):

被依赖项 Phone 确实是先于依赖项 Person 被初始化的,且 Phone 也是后于 Person 被销毁的。

而这次 Person 因为定义在 Phone 之前,IoC容器会依个进行实例化,而如果用上 depends-on 属性,就会强制先实例化被依赖的 Phone

2. 是否会将对象注入到自己属性中

直截了当说:

  • ref 会,而且要求依赖项有被依赖项这个类的属性(即 Person 类的属性中要有 Phone);
  • depends-on 不会,甚至依赖项可以不拥有被依赖项这个类的属性。

保持其他文件不变,仅在 Main.java 文件下方加两行代码:

// Main.java//打开容器,并且实例化容器中的 beans
AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans-relation.xml");//关闭容器,并且销毁容器中的 beans
context.registerShutdownHook();//从 IoC 容器中取用 id 为 person_0 的 bean
Person person = (Person) context.getBean("person_0");//输出 person 的信息
System.out.println(person);

- 依赖属性为 ref

// Output
// 省略实例化、初始化和销毁的顺序Person{name='xxx', age=10, phone=Phone{brand='HUAWEI', model='Mate30 Pro', price=6899}}

Person 被注入了

Bean 的 depends-on 属性相关推荐

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

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

  2. SpringIOC配置文件「bean」标签的属性id class name scope init-method destroy-method factory-bean factory-method

    spring 引入Spring 在没有使用spring的时候写代码的三层架构的时候,dao层与service紧密联系,service与controller紧密联系,在service中new的dao接口 ...

  3. bean标签的常用属性

    这篇文章总结spring中bean标签的常用属性. bean标签常用属性有: id name class factory-method factory-bean init-method destory ...

  4. Spring配置文件中bean标签的scope属性

    转自:https://fj-sh-chz.iteye.com/blog/1775149 singleton  (默认属性) Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引 ...

  5. Spring通过注解的形式 将bean以及相应的属性值 放入ioc容器

    步骤一:在applicationContext.xml中配置扫描器,多个包名之间以逗号隔开 <?xml version="1.0" encoding="UTF-8& ...

  6. spring应用手册-IOC(XML配置实现)-(8)-bean中的scop属性

    戴着假发的程序员出品 文字说明 看文字嫌累的可以查看后面的视频说明 scop属性用于指定bean的作用域.可以取一下几个值: singleton:单例模式(默认):    prototype:多例模式 ...

  7. java Bean拷贝忽略空属性

    java bean的拷贝一般采用两种办法 1.Spring里面的方法, org.springframework.beans.BeanUtils.copyProperties 2.Apache里面的方法 ...

  8. Spring系列-bean标签内autowire属性应用

    文章目录 0.前言 1.autowire属性介绍 1.1.autowire官方介绍 1.2 autowire 理解 2.autowire属性应用范例 2.1.byName 方式使用 2.2.byTyp ...

  9. Spring的Bean的自动装配属性autowire

    Spring自动注入 使用元素的 autowire 属性为一个 bean 定义指定自动装配模式 autowire设置值 no:没开启 byName: 根据bean的id名称,注入到对应的属性里面 by ...

  10. 关于Bean标签的一些属性以及getBean()方法

    id属性: Bean 的唯一标识符,Spring 容器对 Bean 的配置和管理都通过该属性完成,就相当于给 它起一个名字,到时候调用的时候就通过id来调用 class属性: 该属性指定了 Bean ...

最新文章

  1. 春节假期是弯道超车的好机会!
  2. (转)全文检索技术学习(一)——Lucene的介绍
  3. 本地服务器下的局域网安全吗_本地安全认证服务器
  4. 典型医学设计实验GEO数据分析 (step-by-step) - 数据获取到标准化
  5. php的 静态变量,PHP之static静态变量详解
  6. 标准工业关系型数据库和对象关系数据库
  7. MySQL数据分析-(1) 数据库前言
  8. jquery ajax 访问 mysql_使用ajax+jquery+php访问mysql数据库,并且达到不跳转页面的效果。。。...
  9. hadoop2.7的目录结构
  10. 极简主义︱使用Turicreate进行快速图像分类迁移训练与预测(六)
  11. SSM整合(二)(mybatis逆向工程)
  12. 数字图像处理实践(二)
  13. 安卓设计模式のAdapter模式
  14. 三种摘要算法的简单介绍
  15. 梦殇 chapter one
  16. Find a Mother Vertex in a Graph
  17. 陷波滤波器——周期性降噪
  18. 中英双语版Arnold for Cinema 4D 2023(c4d阿诺德渲染器插件)
  19. 轻量化网络结构——MobileNet
  20. 四核处理器_戴尔这款笔记本彪悍,配置四核处理器,双内存插槽,不足4000元...

热门文章

  1. 华为matebook13重装系统后指纹解锁功能失效的解决办法
  2. XX大厦综合布线系统方案
  3. centos6破解root密码
  4. JavaScript基础内功系列,这十篇文章里一定有你感兴趣的
  5. DO447使用过滤器和插件转换器--使用过滤器处理网络地址
  6. IOS开发笔记之常用库索引
  7. torch tensor去掉1维_脸颊两侧长斑的原因 把脸上的斑去掉小窍门4个
  8. Python基础+数据科学入门(六)类
  9. 六步骤确保企业成功选择CRM
  10. 我如何设计数据团队的入职培训课程?