什么是ignoreDependencyInterface和ignoreDependencyType?
?相信看過Spring源碼的讀者一定在遇到過這么兩個方法:
/**
* Ignore the given dependency interface for autowiring.
* 忽略給定依賴接口的自動裝配
* @see org.springframework.context.ApplicationContextAware
*/
void ignoreDependencyInterface(Class<?> ifc);
?
/**
* Ignore the given dependency type for autowiring:
* 忽略給定依賴類型的自動裝配
* @param type the dependency type to ignore
*/
void ignoreDependencyType(Class<?> type);
只看官方文檔的解釋很可能理解錯誤,作者也去查閱了一些文章,但是描述的還是有點難以理解,于是自己實驗證實了一下,話不多說,本文直接通過例子給大家詳細證明這兩個接口的意思和使用方法.
準備用來實驗注入spring容器的bean
首先我們需要準備五個model,作為實驗注入Spring容器中的實例對象,如下:
public class User {
}
//這個接口類用來測試ignoreDependencyInterface方法,看能否注入User
public interface UserAware {
void setUser(User user);
}
?
//這個用來測試ignoreDependencyType方法
public class Admin {
}
?
//這個就是和上面的做對比,不對它做任何處理
public class Role {
}
?
//實現(xiàn)了上面的UserAware接口并實現(xiàn)setUser方法炸庞,
//并且將User埠居、Admin纸颜、Role屬性注入
public class Person implements UserAware{
private User user;
private Admin admin;
private Role role;
?
public User getUser() {
return user;
}
//實現(xiàn)了UserAwre接口的setUser方法
public void setUser(User user) {
this.user = user;
}
?
public Admin getAdmin() {
return admin;
}
public void setAdmin(Admin admin) {
this.admin = admin;
}
?
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
上面代碼中各個對象之間的關(guān)系如下:
其中User、Admin、Role都是空的實例對象,UserAware是個接口,里面有一個setUser(User user)方法,Person類中有User冈止、Admin熙暴、Role三個對象屬性,并且實現(xiàn)了UserAwre接口和它的方法,然后對所有的屬性添加get周霉、set方法.
配置spring注入屬性的xml文件
我們需要將上面的實例bean注入到Spring容器中,所以我們配置一個xml,以xml的方式將bean注入到spring容器中,如下:
<?xml version="1.0" encoding="UTF-8"?>
?
配置啟動類
@Test
public void testSimpleLoad(){
?
XmlBeanFactory beanFactory=new XmlBeanFactory(new ClassPathResource("ignore/beanFactoryTest.xml"));
//beanFactory.ignoreDependencyInterface(UserAware.class);//測試ignoreDependencyInterface方法作用
//beanFactory.ignoreDependencyType(Admin.class);//測試ignoreDependencyType方法作用
Person person = beanFactory.getBean("person", Person.class);
System.out.println("person"+person);
}
好了,所需要測試條件,我們都準備好,接下來我們按照下面5條的流程進行測試,每條我都會截圖運行結(jié)果,我們通過結(jié)果就可以分析出最終的結(jié)果.
先測試不開啟ignoreDependencyInterface方法和ignoreDependency方法的時候,獲取person中的屬性值有些哪些?
測試開啟上面代碼第五行,啟動ignoreDependencyInterface(UserAware.class)方法后,獲取person中的屬性值有哪些?
測試關(guān)閉上面第五行,開啟上面代碼第六行,啟動ignoreDependency(Admin.class)方法后,獲取person中的屬性值有哪些?
測試同時啟用ignoreDependencyInterface方法和ignoreDependency方法后,獲取的person中的屬性值有哪些?
上面4的測試是依賴xml配置中default-autowire="byType"測試的,我們把它改成default-autowire="byName"后在測試一次第4條,結(jié)果又如何?
測試開始
- 先測試不開啟ignoreDependencyInterface方法和ignoreDependency方法的時候,獲取person中的屬性值有些哪些?運行結(jié)果截圖如下:
圖中我們可以看出,person中的三個屬性值都能獲取到.
- 測試只開啟ignoreDependencyInterface(UserAware.class)方法后,運行結(jié)果如下圖:
上圖中我們可以看到person對象中的user屬性值為空,說明user屬性值在開啟了ignoreDependencyInterface(UserAware.class)方法后并不能自動裝配到person中(注意,user只是不能自動注入到person對象中,Spring容器中依然有user實例),到這里我們可以得到一個小結(jié)論:ignoreDependencyInterface方法是忽略指定接口(UserAwre)的set方法的自動裝配!
3.接下來測試只開啟ignoreDependency(Admin.class)方法,運行結(jié)果如下圖:
通過運行結(jié)果可以發(fā)現(xiàn),person對象中的admin屬性沒有被自動裝配到person對象中,所以我們得出一個小結(jié)論:ignoreDependency方法忽略指定依賴類型的自動裝配,ignoreDependency和ignoreDependencyInterface不同的是一個前者按照class類型進行忽略自動裝配,后者按照接口中的set方法進行忽略自動裝配.
4.接下來我們同時開啟ignoreDependency和ignoreDependencyInterface方法,運行截圖如下:
上圖中可以看出,user和admin都不能自動裝配到person對象中.
5.接下來我們修改xml配置文件中的default-autowire="byType",修改為default-autowire="byName",然后在開啟ignoreDependency和ignoreDependencyInterface方法的同時運行的結(jié)果截圖如下:
通過運行結(jié)果我們可以分析出:ignoreDependency和ignoreDependencyInterface方法的忽略自動裝配和自動綁定方式無關(guān)!
總結(jié)
好了通過上面的實驗我們可以得出一下結(jié)論:
ignoreDependencyInterface方法忽略指定依賴接口的自動裝配指的是忽略接口中的set方法這樣的自動裝配方式
ignoreDependency忽略指定依賴類型的自動裝配指的是忽略參數(shù)class類型的自動裝配.
以上兩種忽略方式都和自動裝配(自動綁定)的方式無關(guān).