1. 程式人生 > >Spring XML設定bean的構造引數和屬性方法

Spring XML設定bean的構造引數和屬性方法

XML設定bean的構造引數和屬性方法

構造引數

  • 最簡單的,不用指定contructor parameter的index和type
    Bean:

    package x.y;
    
    public class Foo {
    
    public Foo(Bar bar, Baz baz) {
        // ...
    }
    }

    XML:

    <beans>
    <bean name="foo" class="x.y.Foo">
        <constructor-arg>
            <bean class="x.y.Bar"/>
        </constructor-arg
    >
    <constructor-arg> <bean class="x.y.Baz"/> </constructor-arg> </bean> </beans>

    這種適合Contructor的引數type不相同,並且bean沒有繼承的關係。預設的匹配方法是by type.如果是簡單型別的話就不行了,因為<value>xx</value>這樣的形式,spring不能知道是具體的哪種型別,可能是int也可能是String.參照下面的例子.

  • Constructor Argument Type Matching
    Bean:

    package examples;
    
    public class ExampleBean {
    
     // No. of years to the calculate the Ultimate Answer
     private int years;
    
     // The Answer to Life, the Universe, and Everything
     private String ultimateAnswer;
    
     public ExampleBean(int years, String ultimateAnswer) {
         this.years = years;
         this.ultimateAnswer = ultimateAnswer;
     }
    } 

    XML:

    <bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
    </bean>
  • Constructor Argument Index
    還是使用上面的bean

    <bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
    </bean>

Constructor和Properties的寫法:

  • Properties的bean ref寫法有兩種:
    • 單獨使用ref:

      <!-- setter injection using the nested <ref/> element -->
      <property name="beanOne"><ref bean="anotherExampleBean"/> </property>
    • 使用內嵌的ref:

      <property name="beanTwo" ref="yetAnotherBean"/>
  • Constructor的bean ref寫法有兩種:
    • 單獨使用ref:

      <!-- constructor injection using the nested <ref/> element -->
      <constructor-arg>
      <ref bean="anotherExampleBean"/>
      </constructor-arg>
    • 使用內嵌的ref:

      <!-- constructor injection using the neater 'ref' attribute -->
      <constructor-arg ref="yetAnotherBean"/>

其他的設定(包括property和contructor)

  • Straight values (primitives, Strings, etc.)
    • 方式一:

      <property name="driverClassName">
      <value>com.mysql.jdbc.Driver</value>
      </property>
    • 方式二:

      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  • Collections
    • List

      <property name="someList">
      <list>
      <value>a list element followed by a reference</value>
      <ref bean="myDataSource" />
      </list>
      </property>
    • Map

      <property name="someMap">
      <map>
      <entry>
      <key>
      <value>an entry</value>
      </key>
      <value>just some string</value>
      </entry>
      <entry>
      <key>
      <value>a ref</value>
      </key>
      <ref bean="myDataSource" />
      </entry>
      </map>
      </property>
    • Set

      <property name="someSet">
      <set>
      <value>just some string</value>
      <ref bean="myDataSource" />
      </set>
      </property>

另外值得一提的還有一種寫法:

The p-namespace(從Spring2.0之後開始)

使用這種需要包括一個schemahttp://www.springframework.org/schema/p但是這個特殊的schema不需要schemaLocation,所以可以設定為任何的欄位.

直接看一個例子:

<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>

根據官方備註,這種寫法需要仔細考慮,因為像例子中提到的spouse-ref實際是一個spouse欄位,如果實際bean中包括一個spouse欄位就會產生衝突,而且不容易閱讀。所以需要仔細考慮這麼寫的必要性.