传统建立应用系统对象之间关联关系的方法会导致复杂的代码,使它们很难被服用,很难做单元测试。在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
王永庆 阅读(1583)
评论(2) 编辑 收藏 所属分类:
SPRING