Spring学习笔记(四)-----Spring in Action

Spring学习笔记(四)-----Spring in Action
    传统建立应用系统对象之间关联关系的方法会导致复杂的代码,使它们很难被服用,很难做单元测试。在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 >



你可能感兴趣的:(Spring学习笔记(四)-----Spring in Action)