posts - 66,  comments - 11,  trackbacks - 0
    传统建立应用系统对象之间关联关系的方法会导致复杂的代码,使它们很难被服用,很难做单元测试。在Spring中,组件无需自己负责与其他组件的关联。取而代之的是,容器负责把协作左键的引用给予各个组件。创建系统组件之间协作关系的这个动作叫做装配。
    容器是Spring框架的核心。Spring容器使用IOC管理所有组成应用系统的组件。这包括在协作组件之间建立关联。Spring实际上有2种不同的容器:Bean工厂(org.springframewor.bens.factory.BeanFactory接口定义)是最简单的容器,提供了基础的依赖注入支持。应用上下文(由org.springframework.contextApplicationContext接口定义)建立在Bean工厂基础之上,提供了系统架构服务。
    (1)、BeanFactory这个类负责创建和分发Bean.由于Bean工厂知道应用系统中的很多对象,所以它可以在实例化这些对象的时候,创建协作对象间的关联关系。这样就把配置的负担从Bean自身以及Bean的调用者中脱离出来。在Spring中有几种BeanFactory的实现。其中最常使用的是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件中的定义装载Bean.
例如:BeanFactory factory = new XmlBeanFactory(new FileInputStream("beans.xml"));
这行代码告诉Bean工厂从XML文件中读取Bean的定义信息。但是,现在Bean工厂还没有实例化Bean.Bean是被延迟载入到Bean工厂中的,就是说Bean工厂会立即把Bean定义信息载入进来,但是Bean只有在被需要的时候才被实例化。
      MyBean myBean = (MyBean)factory.getBean("myBean");
当getBean()方法被调用的时候,工厂就会实例化Bean并且使用依赖注入开始设置Bean的属性。
    (2)、ApplicationContext的诸多实现中,有3个实现经常用到:
  ClassPathXmlApplicationContext-从类路径中的XML文件载入上下文定义信息,把上下文定义文件当成类路径资源。
  FileSystemXmlApplicationContext-从文件系统中的XML文件载入上下文定义信息。
  XmlWebApplicationContext-从web系统中的XML文件载入上下文定义信息。
例如:ApplicationContext context = new FileSystemXmlApplicationContext("c:/foo.xml");
      ApplicationContext context = new ClassPathXmlApplicationContext("foo.xml");
FileSystemXmlApplicationContext只能在指定的路径中寻找foo.xml文件,而ClassPathXmlApplicationContext可以在整个类路径中寻找foo.xml.
    应用上下文与Bean工厂的另一个重要区别是关于单实例Bean是如何被载入的。Bean工厂延迟载入所有的Bean,知道getBean()方法被调用时Bean才被创建。应用上下文启动后预载入所有的单实例Bean.

    Spring中的Bean缺省情况下是单例模式。在容器分配Bean的时候,它总是返回同一个实例。如果想每次得到不同的实例你需要将Bean定义为原型模式。定义为原型模式意味着你是定义一个Bean蓝图,而不是一个单一的Bean.<bean>的singleton属性告诉这个bean是否是单例的,如果是true表示是单例的,如果是false表示是原型的。

<bean id="connectionPool" class="com.springinaction.chapter02.MyConnectionPool" init-method="initialize" destroy-method="close"/>

按这样配置,MyConnectionPool被实例化后initialize()方法马上被调用,给Bean初始化池的机会。在Bean从容器中删除之前,close()方法将释放数据库连接。

设值注入:它是一种基于标准命名规范的设置Bean属性的技术。JavaBean规范规定使用对应的set和get方法来设置和获得Bean的属性值。<property>元素的子元素<value>用来设置普通类型的属性,子元素<ref bean="">用来设置要关联的Bean.

内部Bean:另一种不常使用的装配Bean引用的方法是在<property>元素中嵌入一个<bean>元素。
<bean id="courseService" class="com.springinaction.service.training.CourseServiceImpl">
    
<property name="studentService">
        
<bean class="com.springinaction.service.training.StudentServiceImpl"/>
    
</property>
</bean>

这种装配Bean引用的方式的缺点是你无法在其他地方重用这个StudentServiceImpl实例,因为它是一个专门的courseServiceBean建立的实例。

注入的是对象集:如果你有一个属性是一个列表或是一个Bean引用集合,Spring支持多种类型的集合作为属性。
<list><set><map><props>

装配List和数组:装配一个List属性,List里的元素可以是任何一种元素,包括<value><ref>甚至是其他<list>
<property name="barList">
    
<list>
        
<value>bar1</value>
        
<ref bean="bar2"/>
    
</list>
</property>


装配Set:和List一样,Set可以包含任何类型的属性。
<property name="barSet">
    
<set>
        
<value>bar1</value>
        
<ref bean="bar2"/>
    
</set>
</property>

<set>的使用方法和<list>是一样的。唯一不同的地方是它被装到什么样的属性中。<list>是向java.util.List或数组里装配数据,而<set>是向java.util.Set中装配数据。

装配Map:
<property name="barMap">
    
<map>
        
<entry key="key1">
            
<value>bar1</value>
        
</entry>
        
<entry key="key2">
            
<value>bar2</value>
        
</entry>
    
</map>
</property>

Map中的<entry>的数值和<list>以及<set>的一样,可以是任何有效的属性元素。重申一边,包括<value>、<ref>、<list>甚至是另一个<map>。注意,配置<entry>时,属性key的值只能是String.这对于java.util.Map的功能来说有一点限制,java.util.Map是允许任何类型的对象作为主键的。

装配properties:java.util.Properties集合是最后一个能在Spring中装配的集合类。使用<props>元素来装配它。使用<prop>元素表示每条属性。
<property name="barProps">
    
<props>
        
<prop key="key1">bar1</prop>
        
<prop key="key2">bar2</prop>
    
</props>
</property>


设置null
为了将一个属性设为null,你只要使用<null/>元素就行了。
例如:
<property name="foo"><null/><property>



posted on 2009-10-29 10:28 王永庆 阅读(1572) 评论(2)  编辑  收藏 所属分类: SPRING


FeedBack:
# re: Spring学习笔记(四)-----Spring in Action
2009-11-02 22:45 | 天堂露珠
推荐看:《Spring Recipes :A Problem-Solution Approach》
内容是基于Spring2.5的。
Spring in Action 好像是基于Spring2.0的。
  回复  更多评论
  
# re: Spring学习笔记(四)-----Spring in Action
2009-11-02 23:12 | wyq
@天堂露珠
技术是永远都没有尽头的,但是它的出现是有原因的,只要了解出现的原因及出现的本质,你就没有白学,如果只是一味的去追求技术,那你会很累,你也看不到本质。就像现在出了EJB3.0难道2.0就不看了么,现在的这些框架把程序员变的越来越笨。多了解一些本质,我认为是有必要的。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年10月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(1)

随笔分类

随笔档案

关注blogs

搜索

  •  

最新评论

阅读排行榜

评论排行榜