Spring基础知识(二)

参阅: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特性

你可能感兴趣的:(spring,xml,bean,配置管理,IOC)