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


    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.com
    sales=sales@example.com
    support=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异常?
        

  • 相关阅读:
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused 一步搞定!!!
    android 报错 ':app:transformClassesWithMultidexlistForDebug' 或者 transformDexArchiveWithExternalLibsDexMergerForDebug,三步搞定!
    调用一次AJAX,发送两次请求
    es6 去重排序
    实现一个深复制的函数
    判断多个数组里是否有相同的属性
    [余数求和]整除分块
    中缀表达式求值
    [平行四边形]计算几何
    [莫队]小B的询问 洛谷P2709
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3937354.html
Copyright © 2020-2023  润新知