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

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

二、Bean 之间的继承关系。

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

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

  1. <bean class="com.nucsoft.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/>
  2. <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 指定自己的类,而共享相同的属性配置。如:

  1. <bean class="com.nucsoft.spring.bean.Employee" id="employee" p:empName="emp01" p:age="23"/>
  2. <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.例子:

  1. /**
  2. * @author solverpeng
  3. * @create 2016-07-18-15:07
  4. */
  5. public class First {
  6. public First() {
  7. System.out.println("我被实例化了! 我是 First");
  8. }
  9. }
  1. /**
  2. * @author solverpeng
  3. * @create 2016-07-18-15:08
  4. */
  5. public class Second {
  6. public Second() {
  7. System.out.println("我被实例化了! 我是 Second");
  8. }
  9. }

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

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

控制台输出:

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

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

控制台输出:

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

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

e2:添加 depends-on 属性

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

控制台输出:

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

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

  1. <bean class="com.nucsoft.spring.bean.First" id="first" depends-on="third second"/>
  2. <bean class="com.nucsoft.spring.bean.Second" id="second"/>
  3. <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. Microsoft.VisualBasic.DateAndTime.Timer 与 DateTime.Now.TimeOfDay.TotalSeconds 相当

    如题,示例如下: Console.WriteLine(DateTime.Now.TimeOfDay.TotalSeconds); Console.WriteLine(Microsoft.VisualB ...

  2. [Aaronyang] 写给自己的WPF4.5 笔记22 [3d交互与动画 3/4]

    OK,前面我们的3d模型都比较囧啊,最近也看了一点ZAM了解了一下,大致至少可以做个简单的模型用来演示. 1.交互,动起来的思路 ①修改Model3D对象的变换 ②修改应用于ModelVisual3D ...

  3. 七牛CEO许式伟:移动游戏资源存贮的大趋势

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) 9月14日,eoe移动开发者大会正式在北京国家会议中心召开,七牛云储存CEO许式伟先生做了 ...

  4. Navi.Soft30.产品.代码生成器.操作手册

    1系统简介 1.1功能简述 在Net软件开发过程中,大部分时间都是在编写代码,并且都是重复和冗杂的代码.比如:要实现在数据库中10个表的增删改查功能,大部分代码都是相同的,只需修改10%的代码量.此时 ...

  5. vmtool安装成功,但是hgfs下没有被挂接共享目录!

    vmtool安装成功,但是hgfs下没有被挂接共享目录! 2013-01-04 16:05:18|  分类: Linux|字号 订阅     1.使用vmtool 提供的命令——vmware-hgfs ...

  6. 通过lua获取nginx的内置变量,通过这些变量做些逻辑的处理

    Nginx提供了很多内置的变量,如: $arg_PARAMETER 这个变量包含在查询字符串时GET请求PARAMETER的值. $args 这个变量等于请求行中的参数. $binary_remote ...

  7. 少睡与吸烟影响IQ

        导读:据英国<每日邮报>报道,根据科学家一项最新研究发现,一晚的糟糕睡眠,对大脑可能产生很大损害,就等同头部遭到了一次严重的撞击.长期睡眠不好会造成智力下降,请看[科学探索]揭秘: ...

  8. 基情四射的两个css样式

    自定义blog样式时,代码段的line-height继承样式post的line-height,间隔太大了,决定再减小点,css都玩了几年了,感觉中这是很容易的事情.然后,就悲剧了好久,原先自定义样式表 ...

  9. 怎样在EPLAN P8里创建自己想要的电气元件符号

    1.打开Eplan P8 ,新建一个名为"新项目"的项目,然后选择菜单"工具"----"主数据"-----"符号库"-- ...

  10. 在内核中异步请求设备固件firmware的测试代码

    在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void * ...