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

  • A+
所属分类:Linux编程
摘要

在 Spring IOC 容器中 Bean 之间存在继承和依赖关系。 需要注意的是,这个继承和依赖指的是 bean 的配置之间的关系,而不是指实际

一、在 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

Spring中如何配置Hibernate事务 http://www.linuxidc.com/Linux/2013-12/93681.htm

Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm

基于 Spring 设计并实现 RESTful Web Services http://www.linuxidc.com/Linux/2013-10/91974.htm

Spring-3.2.4 + Quartz-2.2.0集成实例 http://www.linuxidc.com/Linux/2013-10/91524.htm

使用 Spring 进行单元测试 http://www.linuxidc.com/Linux/2013-09/89913.htm

运用Spring注解实现Netty服务器端UDP应用程序 http://www.linuxidc.com/Linux/2013-09/89780.htm

Spring 3.x 企业应用开发实战 PDF完整高清扫描版+源代码 http://www.linuxidc.com/Linux/2013-10/91357.htm

除非注明,否则均为@蒲公英网原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.aipgy.com/78838.html

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: