Bean 的 depends-on 属性
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-on 和 ref 属性都可以作为一个 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 属性相关推荐
- 标签系列二:spring 中bean解释以及bean标签里面的属性
一.bean标签: 英文解释:Defines a single (usually named) bean. A bean definition may contain nested tags for ...
- SpringIOC配置文件「bean」标签的属性id class name scope init-method destroy-method factory-bean factory-method
spring 引入Spring 在没有使用spring的时候写代码的三层架构的时候,dao层与service紧密联系,service与controller紧密联系,在service中new的dao接口 ...
- bean标签的常用属性
这篇文章总结spring中bean标签的常用属性. bean标签常用属性有: id name class factory-method factory-bean init-method destory ...
- Spring配置文件中bean标签的scope属性
转自:https://fj-sh-chz.iteye.com/blog/1775149 singleton (默认属性) Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引 ...
- Spring通过注解的形式 将bean以及相应的属性值 放入ioc容器
步骤一:在applicationContext.xml中配置扫描器,多个包名之间以逗号隔开 <?xml version="1.0" encoding="UTF-8& ...
- spring应用手册-IOC(XML配置实现)-(8)-bean中的scop属性
戴着假发的程序员出品 文字说明 看文字嫌累的可以查看后面的视频说明 scop属性用于指定bean的作用域.可以取一下几个值: singleton:单例模式(默认): prototype:多例模式 ...
- java Bean拷贝忽略空属性
java bean的拷贝一般采用两种办法 1.Spring里面的方法, org.springframework.beans.BeanUtils.copyProperties 2.Apache里面的方法 ...
- Spring系列-bean标签内autowire属性应用
文章目录 0.前言 1.autowire属性介绍 1.1.autowire官方介绍 1.2 autowire 理解 2.autowire属性应用范例 2.1.byName 方式使用 2.2.byTyp ...
- Spring的Bean的自动装配属性autowire
Spring自动注入 使用元素的 autowire 属性为一个 bean 定义指定自动装配模式 autowire设置值 no:没开启 byName: 根据bean的id名称,注入到对应的属性里面 by ...
- 关于Bean标签的一些属性以及getBean()方法
id属性: Bean 的唯一标识符,Spring 容器对 Bean 的配置和管理都通过该属性完成,就相当于给 它起一个名字,到时候调用的时候就通过id来调用 class属性: 该属性指定了 Bean ...
最新文章
- 春节假期是弯道超车的好机会!
- (转)全文检索技术学习(一)——Lucene的介绍
- 本地服务器下的局域网安全吗_本地安全认证服务器
- 典型医学设计实验GEO数据分析 (step-by-step) - 数据获取到标准化
- php的 静态变量,PHP之static静态变量详解
- 标准工业关系型数据库和对象关系数据库
- MySQL数据分析-(1) 数据库前言
- jquery ajax 访问 mysql_使用ajax+jquery+php访问mysql数据库,并且达到不跳转页面的效果。。。...
- hadoop2.7的目录结构
- 极简主义︱使用Turicreate进行快速图像分类迁移训练与预测(六)
- SSM整合(二)(mybatis逆向工程)
- 数字图像处理实践(二)
- 安卓设计模式のAdapter模式
- 三种摘要算法的简单介绍
- 梦殇 chapter one
- Find a Mother Vertex in a Graph
- 陷波滤波器——周期性降噪
- 中英双语版Arnold for Cinema 4D 2023(c4d阿诺德渲染器插件)
- 轻量化网络结构——MobileNet
- 四核处理器_戴尔这款笔记本彪悍,配置四核处理器,双内存插槽,不足4000元...