参阅:Spring Framework 开发参考手册
(spring2.0-reference_final_zh_cn.chm)
第三部分:Spring核心技术
一、容器和bean的基本原理
1、Spring中的bean概念
在Spring中,那些组成应用的主体(backbone)及由Spring IoC容器所管理的对象被称之为bean。简单地讲,bean就是由Spring容器初始化、装配及被管理的对象,除此之外,bean就没有特别之处了(与应用中的其他对象没有什么区别)。而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
1、 容器
org.springframework.beans及org.springframework.context包是Spring IoC容器的基础。BeanFactory提供的高级配置机制,使得管理任何性质的对象成为可能。ApplicationContext是BeanFactory的扩展,功能得到了进一步增强,比如更易与Spring AOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现(如针对web应用的WebApplicationContext)。
org.springframework.beans.factory.BeanFactory是Spring IoC容器的实际代表者,IoC容器负责容纳此前所描述的bean,并对bean进行管理。在Spring中,BeanFactory是IoC容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是最常用的一个。该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。 3、接口选择之惑
在实际应用中,用户有时候不知道到底是选择BeanFactory接口还是ApplicationContext接口。但是通常在构建J2EE应用时,使用ApplicationContext将是更好的选择,因为它不仅提供了BeanFactory的所有特性,同时也允许使用更多的声明方式来得到我们想要的功能。
4、配置元数据
Spring支持三种配置元数据格式:XML格式、Java属性文件格式或使用Spring公共API编程实现。由于XML元数据配置格式简单明了,故常采用该格式来表达Spring IoC容器的主要理念和特性。
5、实例化容器的方法
A:FileSystemResource
Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
B:ClassPathResource(同A)
C:ClassPathXmlApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"applicationContext.xml", "applicationContext-part2.xml"});// of course, an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) context;
6、实例化bean的方法
A:用构造器来实例化
B:使用 静态工厂方法实例化
<bean id="exampleBean" class="examples.ExampleBean2"
factory-method="createInstance"/>
C:使用实例工厂方法实例化
<bean id="myFactoryBean" class="..."> ...</bean><bean id="exampleBean" factory-bean="myFactoryBean"
factory-method="createInstance"/>
二、依赖
1、依赖注入(DI)主要有两种注入方式,即Setter注入和 构造器注入。
l Setter注入:通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现基于setter的DI。
l 构造器注入:基于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一个协作者。此外,还可通过给静态工厂方法传参数来构造bean。
2、如何在构造器注入和Setter注入之间进行选择?
由于大量的构造器参数可能使程序变得笨拙,特别是当某些属性是可选的时候。因此通常情况下,Spring开发团队提倡使用setter注入。
尽管如此,构造器注入因为某些原因还是受到了一些人的青睐。一次性将所有依赖注入的做法意味着,在未完全初始化的状态下,此对象不会返回给客户代码(或被调用),此外对象也不可能再次被重新配置(或重新注入)。对于注入类型的选择并没硬性的规定。只要能适合你的应用,无论使用何种类型的DI都可以。对于那些没有源代码的第三方类,或者没有提供setter方法的遗留代码,我们则别无选择--构造器注入将是你唯一的选择。
3、循环依赖
当你主要使用构造器注入的方式配置bean时,很有可能会产生循环依赖的情况。
对于此问题,一个可能的解决方法就是修改源代码,将构造器注入改为setter注入。另一个解决方法就是完全放弃使用构造器注入,只使用setter注入。
4、构造器参数的解析
l 构造器参数类型匹配
l 构造器参数的索引
注意:index属性值从0开始。指定构造器参数索引是使用构造器IoC首选的方式。
5、bean属性及构造器参数详解
bean的属性及构造器参数既可以引用容器中的其他bean,也可以是内联(inline,在spring的XML配置中使用<property/>和<constructor-arg/>元素定义)bean。
(1)、直接量(基本类型、Strings类型等。) <value/>元素
(2)、引用其它的bean(协作者)
<ref bean="someBean"/>:可以引用同一容器或父容器内的任何bean(无论是否在同一XML文件中)。XML 'bean'元素的值既可以是指定bean的id值也可以是其name值。
<ref local="someBean"/>:local属性值必须是目标bean的id属性值。如果在同一配置文件中没有找到引用的bean,XML解析器将抛出一个例外。
<ref parent="accountService"/>:parent属性值既可以是目标bean的id值,也可以是name属性值。而且目标bean必须在当前容器的父容器中。使用parent属性的主要用途是为了用某个与父容器中的bean同名的代理来包装父容器中的一个bean。
(3)、内部bean
(4)、集合
(5)、Nulls:<null/>用于处理null值。Spring会把属性的空参数当作空字符串处理。以下的xml片断将email属性设为空字符串。
(6)、XML-based configuration metadata shortcuts
针对常见的value值或bean的引用,Spring提供了简化格式用于替代<value/>和<ref/>元素。<property/>、<constructor-arg/>及<entry/>元素都支持value属性(attribute),它可以用来替代内嵌的<value/>元素。
(7)、组合属性名称 <property name="fred.bob.sammy" value="123" />
6、使用depends-on
7、延迟初始化bean
8、自动装配(autowire)协作者
9、依赖检查
三、bean的作用域
四、定制bean特性
(spring2.0-reference_final_zh_cn.chm)
第三部分:Spring核心技术
一、容器和bean的基本原理
1、Spring中的bean概念
在Spring中,那些组成应用的主体(backbone)及由Spring IoC容器所管理的对象被称之为bean。简单地讲,bean就是由Spring容器初始化、装配及被管理的对象,除此之外,bean就没有特别之处了(与应用中的其他对象没有什么区别)。而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
1、 容器
org.springframework.beans及org.springframework.context包是Spring IoC容器的基础。BeanFactory提供的高级配置机制,使得管理任何性质的对象成为可能。ApplicationContext是BeanFactory的扩展,功能得到了进一步增强,比如更易与Spring AOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现(如针对web应用的WebApplicationContext)。
org.springframework.beans.factory.BeanFactory是Spring IoC容器的实际代表者,IoC容器负责容纳此前所描述的bean,并对bean进行管理。在Spring中,BeanFactory是IoC容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是最常用的一个。该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。 3、接口选择之惑
在实际应用中,用户有时候不知道到底是选择BeanFactory接口还是ApplicationContext接口。但是通常在构建J2EE应用时,使用ApplicationContext将是更好的选择,因为它不仅提供了BeanFactory的所有特性,同时也允许使用更多的声明方式来得到我们想要的功能。
4、配置元数据
Spring支持三种配置元数据格式:XML格式、Java属性文件格式或使用Spring公共API编程实现。由于XML元数据配置格式简单明了,故常采用该格式来表达Spring IoC容器的主要理念和特性。
5、实例化容器的方法
A:FileSystemResource
Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
B:ClassPathResource(同A)
C:ClassPathXmlApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"applicationContext.xml", "applicationContext-part2.xml"});// of course, an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) context;
6、实例化bean的方法
A:用构造器来实例化
B:使用 静态工厂方法实例化
<bean id="exampleBean" class="examples.ExampleBean2"
factory-method="createInstance"/>
C:使用实例工厂方法实例化
<bean id="myFactoryBean" class="..."> ...</bean><bean id="exampleBean" factory-bean="myFactoryBean"
factory-method="createInstance"/>
二、依赖
1、依赖注入(DI)主要有两种注入方式,即Setter注入和 构造器注入。
l Setter注入:通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现基于setter的DI。
l 构造器注入:基于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一个协作者。此外,还可通过给静态工厂方法传参数来构造bean。
2、如何在构造器注入和Setter注入之间进行选择?
由于大量的构造器参数可能使程序变得笨拙,特别是当某些属性是可选的时候。因此通常情况下,Spring开发团队提倡使用setter注入。
尽管如此,构造器注入因为某些原因还是受到了一些人的青睐。一次性将所有依赖注入的做法意味着,在未完全初始化的状态下,此对象不会返回给客户代码(或被调用),此外对象也不可能再次被重新配置(或重新注入)。对于注入类型的选择并没硬性的规定。只要能适合你的应用,无论使用何种类型的DI都可以。对于那些没有源代码的第三方类,或者没有提供setter方法的遗留代码,我们则别无选择--构造器注入将是你唯一的选择。
3、循环依赖
当你主要使用构造器注入的方式配置bean时,很有可能会产生循环依赖的情况。
对于此问题,一个可能的解决方法就是修改源代码,将构造器注入改为setter注入。另一个解决方法就是完全放弃使用构造器注入,只使用setter注入。
4、构造器参数的解析
l 构造器参数类型匹配
l 构造器参数的索引
注意:index属性值从0开始。指定构造器参数索引是使用构造器IoC首选的方式。
5、bean属性及构造器参数详解
bean的属性及构造器参数既可以引用容器中的其他bean,也可以是内联(inline,在spring的XML配置中使用<property/>和<constructor-arg/>元素定义)bean。
(1)、直接量(基本类型、Strings类型等。) <value/>元素
(2)、引用其它的bean(协作者)
<ref bean="someBean"/>:可以引用同一容器或父容器内的任何bean(无论是否在同一XML文件中)。XML 'bean'元素的值既可以是指定bean的id值也可以是其name值。
<ref local="someBean"/>:local属性值必须是目标bean的id属性值。如果在同一配置文件中没有找到引用的bean,XML解析器将抛出一个例外。
<ref parent="accountService"/>:parent属性值既可以是目标bean的id值,也可以是name属性值。而且目标bean必须在当前容器的父容器中。使用parent属性的主要用途是为了用某个与父容器中的bean同名的代理来包装父容器中的一个bean。
(3)、内部bean
(4)、集合
(5)、Nulls:<null/>用于处理null值。Spring会把属性的空参数当作空字符串处理。以下的xml片断将email属性设为空字符串。
(6)、XML-based configuration metadata shortcuts
针对常见的value值或bean的引用,Spring提供了简化格式用于替代<value/>和<ref/>元素。<property/>、<constructor-arg/>及<entry/>元素都支持value属性(attribute),它可以用来替代内嵌的<value/>元素。
(7)、组合属性名称 <property name="fred.bob.sammy" value="123" />
6、使用depends-on
7、延迟初始化bean
8、自动装配(autowire)协作者
9、依赖检查
三、bean的作用域
四、定制bean特性