Spring依賴檢查


在Spring中,可以使用依賴檢查功能,以確保所要求的屬性可設定或者注入。

依賴檢查模式

4個依賴檢查支援的模式:
  • none – 沒有依賴檢查,這是預設的模式。
  • simple – 如果基本型別(int, long,double…)和集合型別(map, list..)的任何屬性都沒有設定,UnsatisfiedDependencyException將被丟擲。
  • objects – 如果物件型別的任何屬性都沒有設定,UnsatisfiedDependencyException將被丟擲。
  • all – 如果任何型別的任何屬性都沒有被設定,UnsatisfiedDependencyException將被丟擲。

註:預設模式是 none

範例

Customer和Person物件的範例。
package com.tw511.common;

public class Customer 
{
	private Person person;
	private int type;
	private String action;

	//getter and setter methods
}
package com.tw511.common;

public class Person 
{
	private String name;
	private String address;
	private int age;
	
	//getter and setter methods	
}

1. none 依賴檢查

Spring bean組態檔案使用 「none」 依賴檢查模式。
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="CustomerBean" class="com.tw511.common.Customer" >
		<property name="action" value="buy" />
	</bean>

	<bean id="PersonBean" class="com.tw511.common.Person">
		<property name="name" value="yiibai" />
		<property name="address" value="address ABC" />
		<property name="age" value="29" />
	</bean>

</beans>
如果沒有明確定義的依賴檢查模式,其預設為「none」。沒有依賴檢查將執行。

2. simple 依賴檢查

Spring bean的組態檔案使用「simple」依賴檢查模式。
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="CustomerBean" class="com.tw511.common.Customer" 
         dependency-check="simple">

		<property name="person" ref="PersonBean" />
		<property name="action" value="buy" />
	</bean>

	<bean id="PersonBean" class="com.tw511.common.Person">
		<property name="name" value="yiibai" />
		<property name="address" value="address ABC" />
		<property name="age" value="29" />
	</bean>

</beans>
在「type」屬性(基本型別或集合型別),如尚未設定,UnsatisfiedDependencyException將丟擲。
org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'CustomerBean' 
defined in class path resource [config/Spring-Customer.xml]: 
Unsatisfied dependency expressed through bean property 'type': 
Set this property value or disable dependency checking for this bean.

3. objects 依賴檢查

Spring bean組態檔案的 「objects」依賴檢查模式。
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="CustomerBean" class="com.tw511.common.Customer" 
         dependency-check="objects">

		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean" class="com.tw511.common.Person">
		<property name="name" value="yiibai" />
		<property name="address" value="address ABC" />
		<property name="age" value="29" />
	</bean>
	
</beans>
在'person'屬性(物件型別),尚未設定,一個UnsatisfiedDependencyException將丟擲。
org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'CustomerBean' 
defined in class path resource [config/Spring-Customer.xml]: 
Unsatisfied dependency expressed through bean property 'person': 
Set this property value or disable dependency checking for this bean.

4. all 依賴檢查

Spring bean組態檔案的「all」依賴檢查模式。
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="CustomerBean" class="com.tw511.common.Customer" 
         dependency-check="all">

		<property name="action" value="buy" />
	</bean>

	<bean id="PersonBean" class="com.tw511.common.Person">
		<property name="name" value="yiibai" />
		<property name="address" value="address ABC" />
		<property name="age" value="29" />
	</bean>

</beans>
對「simple」和「objects」模式的組合,如果有的話型別(原型,集合和物件)的任何屬性都沒有設定,一個UnsatisfiedDependencyException將被丟擲。

全域性預設的依賴檢查

明確定義的依賴檢查模式,每個Bean組態繁瑣且容易出錯,可以在<beans>根元素設定一個預設的依賴性檢查屬性強制<beans>根元素內宣告的整個bean類適用此規則。然而,這根預設模式將通過一個bean自己指定的模式下可覆蓋。
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" 
	default-dependency-check="all">

	<bean id="CustomerBean" class="com.tw511.common.Customer">
		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean" class="com.tw511.common.Person">
		<property name="name" value="yiibai" />
		<property name="address" value="address ABC" />
		<property name="age" value="29" />
	</bean>
	
</beans>
在這個組態檔案中宣告所有的Bean類默都是「all」依賴檢查模式。
@Required 註解
在大多數情況下,你只需要確保特定屬性已經設定,但有一定是所有的型別(原始,集合或物件)屬性。