Spring基础——在 IOC 容器中 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.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 之间的关系的更多相关文章
- [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring(十二):IOC容器中Bean的生命周期方法
IOC容器中Bean的生命周期方法 1)Spring IOC容器可以管理Bean的声明周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2)Spring IOC容器对Bean的生命周期 ...
- spring IOC 容器中 Bean 的生命周期
IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...
- Spring IOC容器中Bean的生命周期
1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ...
- Spring重点—— IOC 容器中 Bean 的生命周期
一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...
- Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...
- IOC容器中bean的生命周期
一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...
- Spring基础18——通过注解配置bean之间的关联关系
1.组件装配 <context:component-scan>元素还会自动注册AutowiredAnnotaionBeanPostProcessor实例,这是一个bean的后置处理器,该实 ...
- Spring 学习笔记(五)—— Bean之间的关系、作用域、自动装配
继承 Spring提供了配置信息的继承机制,可以通过为<bean>元素指定parent值重用已有的<bean>元素的配置信息. <?xml version="1 ...
随机推荐
- 用VisualC++建立SOAP客户端应用(一)
用VisualC++建立SOAP客户端应用(一) SoapSerializer对象用来构建一个向Web服务发送的SOAP消息.在与服务器连接前,SoapSerializer对象必须与SoapConne ...
- hadoop错误之ClassNotFoundException
http://www.cnblogs.com/kaizhangzhang/p/3495438.html 在win7下运行hadoop-1.1.2 worldcount代码的时候出现下面的错误,折腾了差 ...
- 用户管理 之 Linux 系统中的超级权限的控制
在Linux操作系统中,root的权限是最高的,也被称为超级权限的拥有者.普通用户无法执行的操作,root用户都能完成,所以也被称之为超级管理用户. 在系统中,每个文件.目录和进程,都归属于某一个用户 ...
- Asp.net Core中使用Entity Framework Core CodeFirst
1.安装对应的包 "Microsoft.EntityFrameworkCore.Design": "1.1.0", "Microsoft.Entity ...
- C#实现IDispose接口
.net的GC机制有两个问题:首先GC并不能释放所有资源,它更不能释放非托管资源.其次,GC也不是实时的,所有GC存在不确定性.为了解决这个问题donet提供了析构函数 public class Te ...
- 算法 - 求两个自然数的最小公倍数(C++)
//************************************************************************************************** ...
- [leetode]Binary Search Tree Iterator
用个stack模拟递归即可 /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * Tr ...
- oracle 数据库时间类型为字符串 时间范围大小查询
select * from invoicedetail t2 where t2.Memo is null and to_char(to_date(t2.PrintDate,'yyyy-MM-dd hh ...
- Qt编写自定义控件插件路过的坑及注意事项
在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(http://www.cnblogs.com/feiyangqingyun/p/61 ...
- CLR via C#深解笔记五 - 事件
事件处理实际上是一种具有特殊签名的delegate, 像这个样子:public delegate void EventHandler(object sender, EventArgs e); 类型 ...