(转) Spring读书笔记-----Spring的Bean之配置依赖
前一篇博客介绍了Spring中的Bean的基本概念和作用域(Spring读书笔记-----Spring的Bean之Bean的基本概念),现在介绍Spring Bean的基本配置。
从开始我们知道Java应用中各组件的相互调用的实质可以归纳为依赖关系。根据注入方式的不同,Bean的依赖注入可以分为两种形式:
1、 属性:通过<property …/>元素配置,对应设置注入。
2、 构造器参数:通过<constructor-arg…/>元素配置,对应构造注入。
不管是属性,还是构造器参数,都视为Bean的依赖,接受Spring容器管理,依赖关系的值要么是一个确定的值,要么是Spring容器中的其他Bean的引用。
在一般情况下,我是不应该在配置文件中管理普通属性的引用,通常只是用配置文件管理容器中的Bean实例的依赖关系。
Spring在实例化容器时,会校验BeanFactory中每一个Bean的配置。这些校验包括:
Bean引用的依赖Bean是否指向一个合法的Bean。
Bean的普通属性值是否获得一个有效值。
对于singleton作用域的Bean,如果没有强行取消其预初始化的行为,系统会在创建Spring容器时预初始化所用singleton Bean,与此同时,该Bean所依赖的Bean也被一起实例化。
BeanFactory与ApplicationContext实例化容器中的Bean的时机也是不同的:BeanFactory等到程序需要Bean实例时才创建Bean,而ApplicationContext是在创建ApplicationContext实例时,会预初始化容器中的全部Bean。同时在创建BeanFactory时不会立即创建Bean实例,所以有可能程序可以正确地创建BeanFactory实例,但是当请求Bean实例时依然抛出一个异常:创建Bean实例或注入它的依赖关系时出现错误。所以当配置错误的延迟出现,会给系统带来一些不安全的因素。而ApplicationContext则是默认预初始化所有singleton作用域的Bean,所以ApplicationContext实例化过程比BeanFactory实例化过程的时间和内存开销大,但是一旦创建成功,应用后面的响应速度会非常快,同时可以检验出配置错误,故一般都是推荐使用ApplicationContext作为Spring容器。
其实我们可以指定lazy-int=”true”来强制取消singleton作用域的Bean的预初始。这样该Bean就不会随着ApplicationContext启动而预实例化了。
Spring可以为任何java对象注入任何类型的属性,只要改java对象为该属性提供了对应的setter方法即可。
- <bean id="person" class="lee.Person">
- <!-- Property配置需要依赖注入的属性 -->
- <property name="name" value="chenming" />
- <property name="age" value="22" />
- </bean>
<bean id="person" class="lee.Person">
<!-- Property配置需要依赖注入的属性 -->
<property name="name" value="chenming" />
<property name="age" value="22" />
</bean>
Spring会为<bean…/>元素创建一个java对象,一个这样的java对象对应一个Bean实例,对于如上代码,Spring会采用如下形式来创建Java实例。
- //获取lee.Person类的Class对象
- Class personClass = Class.forName("lee.Person");
- //创建lee.Person类的默认实例
- Object personBean = personBean.newInStance();
//获取lee.Person类的Class对象
Class personClass = Class.forName("lee.Person");
//创建lee.Person类的默认实例
Object personBean = personBean.newInStance();
创建该实例后,Spring就会遍历该<bean../>元素的所有<property…/>子元素。<bean…/>元素每包含一个<property…/>子元素,Spring就会为该Bean实例调用一次setter方法。类似于下面程序:
- //获取name属性的setter方法
- String setName = "set"+"Name";
- //获取lee.Person类里面的Set()Name方法
- java.lang.reflect.Method setMethod = personClass.getMethod(setName, aVal.getClass());
- //调用Bean实例的SetName()方法
- setMethod.invoke(personBean, aVal);
//获取name属性的setter方法
String setName = "set"+"Name";
//获取lee.Person类里面的Set()Name方法
java.lang.reflect.Method setMethod = personClass.getMethod(setName, aVal.getClass());
//调用Bean实例的SetName()方法
setMethod.invoke(personBean, aVal);
对于使用<constructor-arg…/>元素来指定构造器注入,Spring不会采用默认的构造器来创建Bean实例,而是使用特定的构造器来创建该Bean实例。
- <bean id="person" class="lee.Person">
- <constructor-arg index="0" value="aVal" />
- <constructor-arg index="1" value="bVal" />
- </bean>
<bean id="person" class="lee.Person">
<constructor-arg index="0" value="aVal" />
<constructor-arg index="1" value="bVal" />
</bean>
针对上面的代码,Spring会采用类似如下的代码来创建Bean实例:
- //获取lee.Person类的class对象
- Class personClass = Class.forName("lee.Person");
- //获取第一个参数是aVal类型,第二个参数是bVal类型的构造器
- Constructor personCtr = personClass.getConstructor(aVal.getClass(),bVal.getClass());
- //以指定构造器创建Bean实例
- Object bean = personCtr.newInstance(aVal,bVal);
//获取lee.Person类的class对象
Class personClass = Class.forName("lee.Person");
//获取第一个参数是aVal类型,第二个参数是bVal类型的构造器
Constructor personCtr = personClass.getConstructor(aVal.getClass(),bVal.getClass());
//以指定构造器创建Bean实例
Object bean = personCtr.newInstance(aVal,bVal);
上面的程序只是一个实例,实际上Spring还需要根据<property…/>元素、<contructor-arg../>元素所使用value属性,ref属性等来判断需要注入的到底是什么数据类型,并要对这些值进行合适的类型转换,所以Spring的实际处理过程会更加复杂。
读李刚《轻量级Java EE企业应用实战》
(转) Spring读书笔记-----Spring的Bean之配置依赖的更多相关文章
- Spring读书笔记-----Spring的Bean之Bean的基本概念
从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...
- Spring读书笔记-----Spring的Bean之设置Bean值
[java] view plaincopyprint? Java实例的属性值可以有很多种数据类型.基本类型值.字符串类型.java实例甚至其他的Bean实例.java集合.数组等.所以Spring允许 ...
- (转)Spring读书笔记-----Spring的Bean之Bean的基本概念
从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...
- (转)Spring读书笔记-----Spring核心机制:依赖注入
Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...
- Spring读书笔记-----Spring核心机制:依赖注入
spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.今天就和大家一起来学习一下 依赖注入的基本概念 依赖注入(Dependecy Injection),也称为IoC(I ...
- Spring 学习笔记(四)—— XML配置依赖注入
依赖注入(DI)与控制反转(IoC)是同一个概念,都是为了处理对象间的依赖关系. 通过DI/IoC容器,相互依赖的对象由容器负责创建和装配,而不是在代码中完成. Spring支持通过setter方法和 ...
- Spring读书笔记——bean解析
前情回顾 上篇<Spring读书笔记--bean加载>我们从代码角度介绍了有哪些类负责解析XML文件,又是如何一步步从XML格式脱变成我们熟悉的bean的,直到DefaultBeanDef ...
- Spring读书笔记——bean创建(上)
通过<Spring读书笔记--bean加载>和<Spring读书笔记--bean解析>,我们明白了两件事. Spring如何加载消化一个xml配置文件 Spring如何将xml ...
- Spring读书笔记——bean创建(下)
有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...
随机推荐
- IPV6 实现
看代码实现前,请先保证了解ipv6的概念,可以先看ipv6介绍一文.code extract . 在文件 net/ipv6/af_inet6.c 中包含了ipv6协议初始化的主函数. static i ...
- Android开发学习笔记:浅谈WebView
本文转自:http://www.2cto.com/kf/201108/101518.html WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页 ...
- AjaxPro使用说明
转自:http://www.cnblogs.com/lexus/archive/2007/11/29/977281.html 目录 AjaxPro使用说明 1 目录 2 修改历史纪录 ...
- T-SQL查询进阶--详解公用表表达式(CTE)
简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的. 但是,视图是作为系统对象存在数据库中,那对于结果 ...
- python导入上级目录中的模块
python导入同级别模块很方便: import xxx 要导入下级目录页挺方便,需要在下级目录中写一个__init__.py文件 from dirname import xxx 要导入上级目录,可以 ...
- OGRE插件设计-Texture与GLTexture
背景: 学习OGRE,在OGRE中 Core是最小的精简逻辑集合,而真正的功能则需要插件来实现,但是作为插件应该与Core保持最小的连接,同时Core不会调用插件的接口,而动态链接库又不能直接把类连接 ...
- 破解安装 SecureCRT 7.0.2 for mac完美破解版,mac secureCRT , apple secureCRT
mac secureCRT , apple secureCRT 下载地址:http://download.csdn.net/detail/guolichun/7733069 破解安装 SecureC ...
- 各种工具使得数据分析工作使用python变得越来越流行
请参看文章:http://strata.oreilly.com/2013/03/python-data-tools-just-keep-getting-better.html
- bayer图像格式
Bayer数据,其一般格式为:奇数扫描行输出 RGRG……偶数扫描行输出 GBGB…… 根据人眼对彩色的响应带宽不高的大面积着色特点,每个像素没有必要同时输出3种颜色.因此,数据采样时, 奇数扫描行的 ...
- Microsoft Dynamics CRM 2011 相关-摘自网络
Microsoft Dynamics CRM Server 2011硬件需求: 组件 *最低要求 *推荐配置 处理器 x64 体系结构或兼容的双核 1.5 GHz 处理器 四核 x64 体系结构 2 ...