Spring在 IOC 容器中 Bean 之间的关系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/52850068

一、在 Spring IOC 容器中 Bean 之间存在继承和依赖关系。

需要注意的是,这个继承和依赖指的是 bean 的配置之间的关系,而不是指实际意义上类与类之间的继承与依赖,它们不是一个概念。

二、Bean 之间的继承关系。

1.被继承的 ban 称为父 bean,继承这个父 bean 的 bean 称为子 bean。父 bean 可以通过指定 abstract 属性来声明为抽象的,子 bean 通过指定 parent 属性来指定父 bean 的引用。

2.子 bean 从父 bean 中继承配置,包括 bean 的属性配置,同时也可以覆盖从父 bean 继承过来的配置。如:

<bean class="com.linuxidc.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/> 
<bean class="com.linuxidc.spring.bean.Employee" id="employee2" p:empName="emp02" parent="employee"/>

其中 employee2 继承了 employee,继承了 employee 的 age 属性,覆盖了 empName 属性。

3.若想父 bean 只是作为一个模板,可以设置 <bean> 的 abstract 属性为 true,IOC 容器将不会实例化这个 bean。若直接获得,则会报一个 BeanIsAbstractException 的异常。

4.并不是父 bean 的所有属性都会被继承,像 abstract 和 autowire 这样的属性就不会被继承。

5.也可以忽略父 bean 的 class 属性,让子 bean 指定自己的类,而共享相同的属性配置。如:

<bean class="com.linuxidc.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/>
<bean class="com.linuxidc.spring.bean.Employee2" id="employee22" p:address="123mutouren" parent="employee"/>

三、Bean 之间的依赖关系

1.通过 <bean> 的属性 depends-on 属性来指定该 Bean 的前置依赖。所谓的前置依赖是指:在 IOC 在初始化时刻,实例化配置文件中的 bean 时,前置依赖的 bean 要在该 bean 实例化之前实例化。

2.例子:

/**
 * @author solverpeng
 * @create 2016-07-18-15:07
 */
public class First {
    public First() {
        System.out.println("我被实例化了! 我是 First");
    }
}
/**
 * @author solverpeng
 * @create 2016-07-18-15:08
 */
public class Second {
    public Second() {
        System.out.println("我被实例化了! 我是 Second");
    }
}

e1:在没有添加 depends-on 属性前。

<bean class="com.linuxidc.spring.bean.First" id="first"/>
<bean class="com.linuxidc.spring.bean.Second" id="second"/>

控制台输出:

我被实例化了! 我是 Second 我被实例化了! 我是 First

<bean class="com.linuxidc.spring.bean.Second" id="second"/>
<bean class="com.linuxidc.spring.bean.First" id="first"/>

控制台输出:

我被实例化了! 我是 Second 我被实例化了! 我是 First

结论:由上述可以看出,在不指定 depends-on 的前提下,IOC 容器默认实例化的顺序是按照 bean 在配置文件中的顺序来实例化的。

e2:添加 depends-on 属性

<bean class="com.linuxidc.spring.bean.First" id="first" depends-on="second"/>
<bean class="com.linuxidc.spring.bean.Second" id="second"/>

控制台输出:

我被实例化了! 我是 Second 我被实例化了! 我是 First

3.如果前置依赖于多个 Bean,则可以通过逗号或空格的方式指定多个依赖。并且是按照先后顺序进行实例化。如:

<bean class="com.linuxidc.spring.bean.First" id="first" depends-on="third second"/>
<bean class="com.linuxidc.spring.bean.Second" id="second"/>
<bean class="com.linuxidc.spring.bean.Third" id="third"/>

控制台输出:

我被实例化了! 我是 Third 我被实例化了! 我是 Second 我被实例化了! 我是 First

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Laoqi's Linux运维专列

正则三剑客-sed

与grep不同的是,当使用sed匹配字符串的时候如下: #sed -n ‘//‘p file             // 内填写需要匹配的字符串 例如: #s...

3095
来自专栏JavaEdge

Jackson常用注解详解1 初级2 中级

2926
来自专栏我的小碗汤

Go语言常见坑

这里列举的Go语言常见坑都是符合Go语言语法的, 可以正常的编译, 但是可能是运行结果错误, 或者是有资源泄漏的风险。

743
来自专栏逍遥剑客的游戏开发

PL/0语言编译程序分析

3205
来自专栏鸿的学习笔记

python的抽象基类

与jvm上的语言不一样,python的语言没有interface关键字,而且除了抽象基类,每个类都有相应的接口:类实现或继承的公开属性(方法或数据类型)

911
来自专栏架构师小秘圈

shell极简教程(二)

一,题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工作效率。没有一个大公司不要求linux的基本技能的,只是...

3957
来自专栏知无涯

XSL 简单判断指令及多条件判断指令

3388
来自专栏编程心路

想学习php的,不如来这里看看

win+R打开命令行,cmd进DOS窗口 DOS命令开启关闭Apache和Mysql Apache启动关闭命令

1253
来自专栏前端知识分享

第11天:JS中变量、字符串基础知识

js页面效果:轮播图、选项卡、地图、表单验证javascript是弱变量类型的语言,变量只需要用var来声明。而java要根据变 量类型来声明,

3813
来自专栏nummy

ECMAScript 6 特性ECMAScript 6 特性

ECMAScript 6,也被称做ECMAScript 2015,是ECMAScript标准的下一个版本。这个标准预计将于2015年6月被正式批准。ES6是这门...

881

扫码关注云+社区

领取腾讯云代金券