Spring攻略学习笔记(2)------配置Spring IoC容器中的Bean

 (1) 每个Bean都应该提供一个唯一的名称或id,以及一个完全限定的类名,用来让IoC容器对其进行实例化。对于简单类型的每个bean属性(例如String和其他简单类型),可以为其指定一个<value>元素。Spring会试图将你指定的值转换为该属性的声明类型。为了通过setter注入配置一个属性,可使用<property>元素,并在其name属性中指定属性名称。注意: 每个<property>要求bean包含对应的一个setter方法。如下:
     <bean name="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="prefix">
<value>30</value>
</property>
<property name="suffix">
<value>A</value>
</property>
<property name="initial">
<value>100000</value>
</property>
</bean>
        也可以在<constructor-arg>元素中声明,通过构造函数注入配置Bean属性。 书上说<constructor-arg>中没有name属性是因为构造函数参数是基于位置的,但是最新版的(不知从哪个版本开始)Spring中<constructor-arg>元素是有name属性的。如下:
       <bean name="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<constructor-arg name="prefix">
<value>30</value>
</constructor-arg>
<constructor-arg name="suffix">
<value>A</value>
</constructor-arg>
<constructor-arg name="initial">
<value>100000</value>
</constructor-arg>
</bean>
        实际上标记Bean的首选方法是:通过标准的XML id属性,如果你的文本编辑器是XML感知的,就能在设计时校验每个Bean的唯一性。
      <bean id="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
。。。
      </bean>
         书上说Spring允许在name属性中为Bean指定多个以逗号分隔的,但不能在id属性中这么做,因为这里不允许逗号。但最新版的Spring中是id属性中可以含有特殊字符(包含逗号),但name属性不能包含逗号。
       实际上,Bean名称和Bean id都是必须的。没有定义名称的Bean称作匿名Bean。这样的Bean通常只用于与Spring容器交互,这种情况下将只按类型注入,或者将会在一个外部Bean的声明中嵌入它。
(2)用简写定义Bean属性
       可以在<property>元素和<constructor-arg>元素中提供value属性替换包围在<value>元素中的属性。
       <bean id="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="prefix" value="30" />
<property name="suffix" value="A" />
<property name="initial" value="100000" />
        
        <bean name="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<constructor-arg name="prefix" value="30" />
<constructor-arg name="suffix" value="A" />
<constructor-arg name="initial" value="100000" />
</bean>
        这样简洁不少。从Spring 2.0开始,可以 使用p schema像<bean>元素中的属性那样定义Bean属性。如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator"   p:prefix="30" p:suffix="A" p:initial="100000"  />
</beans>
(3)为Bean配置集合
         为了在Bean配置中定义java.util.List接口的属性,需指定一个包含元素的<list>标志。<list>标记中所允许的元素可以是由<value>指定的常量值、<ref>指定的Bean引用、<bean>指定的内部Bean定义、<idref>指定的ID引用定义,或者<null>指定的空元素。甚至可以在一个集合中嵌入另一个集合。
       <bean id="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="suffixes">
<list>
<value>A</value>
<bean class="java.net.URL">
<constructor-arg value="http" />
<constructor-arg value="www.apress.com" />
<constructor-arg value="/" />
</bean>
<null />
</list>
</property>
<property name="initial" value="100000" />
</bean>
          Bean配置文件中的数组定义与<list>标记指出的列表相同。
         为了定义java.util.Set接口的属性,使用<set>标记来定义元素,方法与List相同。
         <bean id="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="suffixes">
<set>
<value>A</value>
<bean class="java.net.URL">
<constructor-arg value="http" />
<constructor-arg value="www.apress.com" />
<constructor-arg value="/" />
</bean>
<null />
</set>
</property>
<property name="initial" value="100000" />
</bean>
          Spring使用了java.util.LinkedHashSet保留了元素的顺序。
        在Spring中,Map由<map>标记定义,带有多个<entry>标记作为子项目,每个项目包含一个关键字和一个值。关键字必须在<key>标记中定义,关键字和值的类型没有限制,可以为他们指定一个<value>、<ref>、<bean>、<idref>或<null>值。Spring也将使用java.util.LinkedHashMap保留Map项目的顺序。
        <bean id="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="suffixes">
<map>
<entry>
<key>
<value>type</value>
</key>
<value>A</value>
</entry>
<entry>
<key>
<value>url</value>
</key>
<bean class="java.net.URL">
<constructor-arg value="http" />
<constructor-arg value="www.apress.com" />
<constructor-arg value="/" />
</bean>
</entry>
</map>
</property>
<property name="initial" value="100000" />
</bean>
        可以用简写将关键字和值对用<entry>标记的属性来定义。如果是简单常量,可使用key和value属性,如果是引用,可以用key-ref和value-ref定义。
        <bean id="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="suffixes">
<map>
<entry key="type" value="A" />
<entry key="url" >
<bean class="java.net.URL">
<constructor-arg value="http" />
<constructor-arg value="www.apress.com" />
<constructor-arg value="/" />
</bean>
</entry>
</map>
</property>
<property name="initial" value="100000" />
</bean>
        java.util.Properties集合非常接近于Map,它也实现了java.util.Map接口,并且以键值对的形式存储项目。唯一的不同是Properties集合的关键字和值始终是字符串。为了在Spring中定义java.util.Properties集合,使用<props>标记,以多个<prop>标记作为子项目。每个<prop>标记必须定义一个key属性并包含对应的值。
       <bean id="sequenceGenerator"
class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator">
<property name="suffixes">
<props>
<prop key="type">A</prop>
<prop key="url">http://www.apress.com/</prop>
<prop key="null">null</prop>
</props>
</property>
<property name="initial" value="100000" />
</bean>
        如果使用继承定义Bean,子bean的集合可以通过设置merge属性为true与父Bean合并。对于List集合,子元素将附加在父元素之后保持顺序。对于Set或Map集合,如果值相同,子元素将覆盖父元素。

     

 

posted @ 2013-04-14 12:48  xinyuyuanm  阅读(325)  评论(0编辑  收藏  举报