(转) 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方法即可。

[html] view plaincopyprint?

  1. <bean id="person" class="lee.Person">
  2. <!-- Property配置需要依赖注入的属性 -->
  3. <property name="name" value="chenming" />
  4. <property name="age" value="22" />
  5. </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实例。

[java] view plaincopyprint?

  1. //获取lee.Person类的Class对象
  2. Class  personClass = Class.forName("lee.Person");
  3. //创建lee.Person类的默认实例
  4. 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方法。类似于下面程序:

[java] view plaincopyprint?

  1. //获取name属性的setter方法
  2. String setName = "set"+"Name";
  3. //获取lee.Person类里面的Set()Name方法
  4. java.lang.reflect.Method setMethod = personClass.getMethod(setName, aVal.getClass());
  5. //调用Bean实例的SetName()方法
  6. 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实例。

[html] view plaincopyprint?

  1. <bean id="person" class="lee.Person">
  2. <constructor-arg index="0" value="aVal" />
  3. <constructor-arg index="1" value="bVal" />
  4. </bean>
	<bean id="person" class="lee.Person">
		<constructor-arg index="0" value="aVal" />
		<constructor-arg index="1" value="bVal" />
	</bean>

针对上面的代码,Spring会采用类似如下的代码来创建Bean实例:

[java] view plaincopyprint?

  1. //获取lee.Person类的class对象
  2. Class  personClass = Class.forName("lee.Person");
  3. //获取第一个参数是aVal类型,第二个参数是bVal类型的构造器
  4. Constructor personCtr = personClass.getConstructor(aVal.getClass(),bVal.getClass());
  5. //以指定构造器创建Bean实例
  6. 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企业应用实战》

时间: 2024-12-02 10:56:31

(转) Spring读书笔记-----Spring的Bean之配置依赖的相关文章

Spring读书笔记-----Spring的Bean之Bean的基本概念

从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架所做的就是两件事:开发Bean.配置Bean.对于Spring矿建来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成“依赖注入”. 一.Bean的定义 <beans…/>元素是Spring配置文件的根元素,<bean…/>元素师<beans../>

(转)Spring读书笔记-----Spring的Bean之Bean的基本概念

从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架所做的就是两件事:开发Bean.配置Bean.对于Spring矿建来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成“依赖注入”. 一.Bean的定义 <beans…/>元素是Spring配置文件的根元素,<bean…/>元素师<beans../>

Spring读书笔记-----Spring的Bean之设置Bean值

[java] view plaincopyprint? Java实例的属性值可以有很多种数据类型.基本类型值.字符串类型.java实例甚至其他的Bean实例.java集合.数组等.所以Spring允许通过如下几个元素为Bean实例的属性指定值: value ref bean list.set.map.props 一.value:设置普通属性值 <value.../>元素用于指定字符串类型.基本类型的属性值.Spring使用XML解析器来解析出这些数据,然后利用java.beans.Proper

(转)Spring读书笔记-----Spring核心机制:依赖注入

Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就可以称A组件依赖于B组件.我们通过使用依赖注入,Java EE应用中的各种组件不需要以硬编码方式耦合在一起,甚至无需使用工厂模式.当某个Java 实例需要其他Java 实例时,系统自动提供所需要的实例,无需程序显示获取,这种自动提供java实例我们谓之为依赖注入,也可以称之为控制反转(Inversi

Spring读书笔记-----部署我的第一个Spring项目

一.Spring介绍 Spring是一个轻量级的Java EE容器,它也是一种从实际需求出发,着眼于轻便,灵活,易于开发,易测试和易部署的轻量级开发框架.Spring它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率. Spring为企业应用的开发提供了一个轻量级的解决方案.该方案包括:基于依赖注入的核心控制,基于AOP的声明式的事务管理,与持久层技术的耦合,以及优秀的Web MVC框架等.它致力于为Java EE 应用各层的解决方案. 使用S

(转) Spring读书笔记-----部署我的第一个Spring项目

一.Spring介绍 Spring是一个轻量级的Java EE容器,它也是一种从实际需求出发,着眼于轻便,灵活,易于开发,易测试和易部署的轻量级开发框架.Spring它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率. Spring为企业应用的开发提供了一个轻量级的解决方案.该方案包括:基于依赖注入的核心控制,基于AOP的声明式的事务管理,与持久层技术的耦合,以及优秀的Web MVC框架等.它致力于为Java EE 应用各层的解决方案. 使用S

(转)Spring 读书笔记-----使用Spring容器(一)

Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口.他们都可代表Spring容器,Spring容器是生成Bean实例的工厂,并且管理容器中的Bean. Bean是Spring管理的基本单位,在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源.Hibernate的SessionFactory.事务管理器等.在Spring中,Bean的是一个非常广义的概念

(转)Spring读书笔记-----使用Spring容器(二)

一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFactory的功能. ApplicationContext允许以声明式方式操作容器,无须手动创建它.在Web应用启动时自动创建ApplicationContext.当然,也可以采用编程方式创建ApplicationContext. 除了提供BeanFactory所支持的全部功能外,Applicatio

Spring学习笔记--Spring IOC

沿着我们上一篇的学习笔记,我们继续通过代码学习IOC这一设计思想. 6.Hello类 第一步:首先创建一个类Hello package cn.sxt.bean; public class Hello { private String name; public void setName(String name) { this.name = name; } public void show(){ System.out.println("hello,"+name); } } 第二步:创建配置