Spring3.0官网文档学习笔记(七)--3.4.2

来源:互联网 发布:韦东山嵌入式linux项目 编辑:程序博客网 时间:2024/05/22 03:15
3.4.2 依赖与配置的细节
    3.4.2.1  Straight values (primitives, Strings, and so on)
    JavaBeans PropertyEditors被用来转换这些value到实际的类型。?

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><!-- results in a setDriverClassName(String) call --><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="masterkaoli"/></bean>

    使用p-namespace使得拼写更加简洁(但是拼写错误会在运行时才被发现,而不是在编辑时,除非使用Intellij IDEA或者SpringSource Tool Suite)

<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.0.xsd"><bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"      destroy-method="close"      p:driverClassName="com.mysql.jdbc.Driver"      p:url="jdbc:mysql://localhost:3306/mydb"      p:username="root"      p:password="masterkaoli"/></beans>
    另外一种配置(这种模式,Spring容器将element元素转成java.util.Properties实例通过使用JavaBeans PropertyEditor机制,在这种配置下,Spring团队建议用这种方法):

<bean id="mappings"    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <!-- typed as a java.util.Properties --> <property name="properties">    <value>       jdbc.driver.className=com.mysql.jdbc.Driver       jdbc.url=jdbc:mysql://localhost:3306/mydb    </value> </property></bean>


    关于idref元素,被用于<constructor-arg/>或者<property/>元素中,是一种防错措施。

<bean id="theTargetBean" class="..."/><bean id="theClientBean" class="...">  <property name="targetName">      <idref bean="theTargetBean" />  </property></bean>
<bean id="theTargetBean" class="..." /><bean id="client" class="...">  <property name="targetName" value="theTargetBean" /></bean>
     以上第一种方案比第二种方案好。理由:第一种配置能使得spring在部署的时候验证被引用的bean是否存在;第二种则没有,只有等这个bean被初始化的时候才会去验证。

     此外,如果被引用的bean再同一个xml单元,而且bean的名字就是bean的id,那么可以使用local属性。这样一来允许xml解析器更早的去验证bean。

<property name="targetName"> <!-- a bean with id 'theTargetBean' must exist; otherwise an exception will be thrown --> <idref local="theTargetBean"/></property>
3.4.2.2 对其他beans的引用
    ref元素作为<constructor-arg/>或者<property/>的一个属性。
    ref元素的bean属性可以跟对应bean的id属性一致,或者是对应bean的其中一个name一致。
    ref元素的local属性的值要跟对应bean的id属性一致。
    ref元素的parnet属性的值要跟对应bean的id属性一致,或者是对应bean的其中一个name一致。而且对应bean要存在于当前容器的父容器之中:

<!-- in the parent context --><bean id="accountService" class="com.foo.SimpleAccountService">  <!-- insert dependencies as required as here --></bean>
<!-- in the child (descendant) context --><bean id="accountService"  <-- bean name is the same as the parent bean -->    class="org.springframework.aop.framework.ProxyFactoryBean">    <property name="target">        <ref parent="accountService"/>  <!-- notice how we refer to the parent bean -->    </property>  <!-- insert other configuration and dependencies as required here --></bean>
3.4.2.3 内部beans
    <bean/>元素存在于<property/>或<constructor-arg/>元素中,就称之为内部bean。
<bean id="outer" class="..."><!-- instead of using a reference to a target bean, simply define the target bean inline --><property name="target">  <bean class="com.example.Person"> <!-- this is the inner bean -->    <property name="name" value="Fiona Apple"/>    <property name="age" value="25"/>  </bean></property></bean>
    内部bean不需要声明一个id或者name,容器会忽略掉这些属性。同时忽略掉scope属性,它的scope是prototypes。

3.4.2.4 集合

<bean id="moreComplexObject" class="example.ComplexObject"><!-- results in a setAdminEmails(java.util.Properties) call --><property name="adminEmails">  <props>      <prop key="administrator">administrator@example.org</prop>      <prop key="support">support@example.org</prop>      <prop key="development">development@example.org</prop>  </props></property><!-- results in a setSomeList(java.util.List) call --><property name="someList">  <list>      <value>a list element followed by a reference</value>      <ref bean="myDataSource" />  </list></property><!-- results in a setSomeMap(java.util.Map) call --><property name="someMap">  <map>      <entry key="an entry" value="just some string"/>      <entry key ="a ref" value-ref="myDataSource"/>  </map></property><!-- results in a setSomeSet(java.util.Set) call --><property name="someSet">  <set>      <value>just some string</value>      <ref bean="myDataSource" />  </set></property></bean>
    map的key或者value、set的value还可以是以下的任何一个元素:

bean | ref | idref | list | set | map | props | value | null
    集合合并
    从spring2.0开始,就支持集合合并。
    集合合并允许定义父类型<list/>, <map/>, <set/>或 <props/>元素,然后利用子类型<list/>, <map/>, <set/>或 <props/>元素继承和重写父集合的值。最终子类型集合的值就是合并后的结果。

<beans><bean id="parent" abstract="true" class="example.ComplexObject">  <property name="adminEmails">      <props>          <prop key="administrator">administrator@example.com</prop>          <prop key="support">support@example.com</prop>      </props>  </property></bean><bean id="child" parent="parent">  <property name="adminEmails">      <!-- the merge is specified on the *child* collection definition -->      <props merge="true">          <prop key="sales">sales@example.com</prop>          <prop key="support">support@example.co.uk</prop>      </props>  </property></bean><beans>
    上述结果:

administrator=administrator@example.comsales=sales@example.comsupport=support@example.co.uk
    集合合并后对list会保存顺序,对set,map,properties则没有这一说法。

    集合合并的约束:
    你不能使用不同类型的集合进行合并;
    merge属性只能放在子类型的集合端;
    集合合并只在spring2.0及以后的版本提供。

    强类型集合(spring在注入前,先判断accounts的属性,然后将要注入的值转成合适的类型注入):

public class Foo {  private Map<String, Float> accounts;  public void setAccounts(Map<String, Float> accounts) {      this.accounts = accounts;  }}
<beans>  <bean id="foo" class="x.y.Foo">      <property name="accounts">          <map>              <entry key="one" value="9.99"/>              <entry key="two" value="2.75"/>              <entry key="six" value="3.99"/>          </map>      </property>  </bean></beans>
3.4.2.5 null和空字符串 

<bean class="ExampleBean"><property name="email" value=""/></bean>

   上述跟exampleBean.setEmail("")的效果是一样的;

<bean class="ExampleBean"><property name="email"><null/></property></bean>
  上述跟 exampleBean.setEmail(null)的效果是一样的;

3.4.2.5 xml使用p-namespace作为快捷方式
    Spring2.0及之后的版本支持。
    p-namespace并不是被定义在xsd文件,而是只存在于Spring的core。  

<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.0.xsd">  <bean name="classic" class="com.example.ExampleBean">      <property name="email" value="foo@bar.com"/>  </bean>  <bean name="p-namespace" class="com.example.ExampleBean"        p:email="foo@bar.com"/></beans>
<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.0.xsd">  <bean name="john-classic" class="com.example.Person">      <property name="name" value="John Doe"/>      <property name="spouse" ref="jane"/>  </bean>  <bean name="john-modern"      class="com.example.Person"      p:name="John Doe"      p:spouse-ref="jane"/>  <bean name="jane" class="com.example.Person">      <property name="name" value="Jane Doe"/>  </bean></beans>
3.4.2.7 Compound property names(引用对象的属性注入)

<bean id="foo" class="foo.Bar"><property name="fred.bob.sammy" value="123" /></bean>
    叫foo的bean有一个fred属性,fred对象有一个bob属性,bob对象有一个sammy属性。要让这个配置有效,在foo被创建之后fred、bob、sammy属性不可以为null。否则报NullPointerException异常?
    

0 0
原创粉丝点击