Spring XML設定bean的構造引數和屬性方法
阿新 • • 發佈:2019-02-04
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
這種適合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"/>
- 單獨使用ref:
- 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"/>
- 單獨使用ref:
其他的設定(包括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>
- List
另外值得一提的還有一種寫法:
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欄位就會產生衝突,而且不容易閱讀。所以需要仔細考慮這麼寫的必要性.