自動依賴檢查可以保證所有java bean中的屬性(set方法)都在Spring中正確的配置。如果在一個java bean中定義了一個name屬性,并且也setName方法。那么在開啟自動依賴檢查功能后,就必須在Spring中定義這個屬性,否則Spring將拋出異常。
請看下面的例子:
Dao.java
包含一個setName方法。
package research.spring.beanfactory.ch3;
public class Dao {
private String name;
public void setName(String name) {
this.name = name;
}
}
context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="dao" class="research.spring.beanfactory.ch3.Dao"> </bean>
<bean id="database" class="research.spring.beanfactory.ch3.Database">
</bean>
</beans>
我們在context.xml沒有定義Dao的name屬性。上面的配置,Spring可以正常的實例化Dao對象。
下面我們修改context.xml:
我們通過dependency-check=all,在Dao上增加了自動依賴檢查的功能。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="dao" class="research.spring.beanfactory.ch3.Dao" dependency-check="all" > </bean>
<bean id="database" class="research.spring.beanfactory.ch3.Database">
</bean>
</beans>
當配置依賴檢查時,Spring實例化Dao時會拋出一個異常:

Spring定義了4種依賴檢查的策略:
不進行依賴檢查。
只對簡單屬性和集合中的簡單屬性進行檢查。不對依賴的對象檢查。
只對為對象類型的屬性進行檢查。
對所有類型進行檢查。
如果把上面例子里的context.xml改成這樣:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="dao" class="research.spring.beanfactory.ch3.Dao" dependency-check="objects" > </bean>
<bean id="database" class="research.spring.beanfactory.ch3.Database">
</bean>
</beans>
Spring將不會拋出異常,因為objects只對依賴的對象進行檢查。
dependency-check在Spring中又以下的限制:
- 不能對構造函數中的參數進行檢查。
- 即使屬性中有默認值,只要包含了set方法,那么dependency-check仍然需要檢查Spring中是否配置了這個屬性。
package research.spring.beanfactory.ch3;
public class Dao {
private Database database;
private String name="chenjie";
//dependency-check仍然會檢查這個屬性是否配置注入
public void setName(String name) {
this.name = name;
}
public void setDatabase(Database database) {
this.database = database;
}
}
即使Dao設置里name得默認值,但是只要有setName方法,dependency-check仍然會判斷是否在配置文件中設置了setName對應的注入。