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

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

二、Bean 之间的继承关系。

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

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

<bean class="com.nucsoft.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/>
<bean class="com.nucsoft.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.nucsoft.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/>
<bean class="com.nucsoft.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.nucsoft.spring.bean.First" id="first"/>
<bean class="com.nucsoft.spring.bean.Second" id="second"/>

控制台输出:

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

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

控制台输出:

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

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

e2:添加 depends-on 属性

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

控制台输出:

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

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

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

控制台输出:

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

Spring基础——在 IOC 容器中 Bean 之间的关系的更多相关文章

  1. [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. Spring(十二):IOC容器中Bean的生命周期方法

    IOC容器中Bean的生命周期方法 1)Spring IOC容器可以管理Bean的声明周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2)Spring IOC容器对Bean的生命周期 ...

  3. spring IOC 容器中 Bean 的生命周期

    IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...

  4. Spring IOC容器中Bean的生命周期

    1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ...

  5. Spring重点—— IOC 容器中 Bean 的生命周期

    一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...

  6. Spring学习-- IOC 容器中 bean 的生命周期

    Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...

  7. IOC容器中bean的生命周期

    一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...

  8. Spring基础18——通过注解配置bean之间的关联关系

    1.组件装配 <context:component-scan>元素还会自动注册AutowiredAnnotaionBeanPostProcessor实例,这是一个bean的后置处理器,该实 ...

  9. Spring 学习笔记(五)—— Bean之间的关系、作用域、自动装配

    继承 Spring提供了配置信息的继承机制,可以通过为<bean>元素指定parent值重用已有的<bean>元素的配置信息. <?xml version="1 ...

随机推荐

  1. 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三)

    这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000005040834 突然想起来我这个博客冷落了好多年了,也该更新一下,呵 ...

  2. JavaScript-求时间差

    var date1=new Date(); //开始时间 alert("aa"); var date2=new Date(); //结束时间 var date3=date2.get ...

  3. iOS中生成并导入基于Swift编程语言的Framework

    从iOS 8.0开始就引入了framework打包方式以及Swift编程语言.我们可以主要利用Swift编程语言将自己的代码打包成framework.不过当前Xcode 7.x在自动导入framewo ...

  4. Swift编程语言中的方法引用

    由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与 ...

  5. NetMQ发布订阅C#示例

    NetMQ (ZeroMQ to .Net),ØMQ号称史上最快中间件.它对socket通信进行了封装,使得我们不需要写socket函数调用就能完成复杂的网络通信.和一般意义上的消息队列产品不同的是, ...

  6. [转]Sublime Text3注册码(可用)

    补充:2016.05 最近经过测试,3个注册码在新版3103的sublime上已经不可用了. 现补充两枚新版的license key: —– BEGIN LICENSE —– Michael Barn ...

  7. android 检测网络是否可用

    /**     * 检测网络是否可用     *      * @return     */    public boolean isNetworkConnected() {        Conne ...

  8. Asp.net Core中使用Entity Framework Core CodeFirst

    1.安装对应的包 "Microsoft.EntityFrameworkCore.Design": "1.1.0", "Microsoft.Entity ...

  9. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

    访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...

  10. [Javascript] Functor Basic Intro

    Well, this stuff will be a little bit strange if you deal with it first time. Container Object: Just ...