申明:本文不是講解spring如何使用註解,本文只是通過乙個簡單的實現,來理解spring是如何注入乙個物件的。
用過spring的同學都知道,spring利用註解來實現依賴注入,使得各個類之間的耦合性極大的降低了。但是僅僅是使用,並不能理解到spring內部是怎麼實現的。筆者沒有看過spring的原始碼。只能從自己的角度來談談spring是怎麼實現的。感興趣的同學可以在看過本文之後,深入的了解spring.
很多時候,我們都有這樣的應用場景。比如dao層,你會先申明乙個介面,比如iuserdao,表示用來處理user的乙個介面,然後再寫乙個實現類userdaoimpl實現了iuserdao中的方法,然後在上層service層中注入。啟動之後spring將自己掃瞄自動為我們注入例項化的物件,使得我們不用在意各個物件的生命週期。接下來就來聊聊具體是怎麼注入的。
假設現在已經有以下的類:
public inte***ce iuserdao
public class userdaoimpl implements iuserdao
@override
public string getdata()
}
其中fieldinject是筆者模仿寫的乙個註解,具體定義如下
@target(elementtype.field)
@retention(retentionpolicy.runtime)
@documented
public @inte***ce fieldinject
具體關於註解上面的元註解的含義,可以看另外一篇部落格。這裡就不展開說明了。
以上就是準備工作了,接下來就是講解真正的初始化方法了。
假設我們現在有乙個類的class物件,那麼我們可以根據這個class物件找到哪些成員變數是加了指定的註解的。**如下
//下面開始注入
for(int i=0; i在這段**中,筆者查詢的註解是自己實現的乙個fieldinject註解,註解本身並不影響**的執行。通過判斷是否為空可以得出某個成員變數是否加了指定的註解。如果發現成員變數加了註解,就可以為該成員變數注入例項化的物件了。
問題1:怎麼知道注入哪個物件?
問題2:怎麼注入?
問題2很好解決,如果原來的類中帶有setter方法,那麼可以使用method.invoke()方法來呼叫並注入。或者通過field直接注入都可以。那麼主要是問題1,怎麼找到合適的注入物件。
spring有多種注入的策略,比如按照裝配名稱,或者是預設實現了介面或者抽象類的子類例項物件來注入。總之,不同的策略只是選擇的不同,我們可以假定使用找到的第乙個合適子類的例項物件來注入。
//找到某個類的子類【涉及到spring的選擇策略】
private class findsubclass(string fullclassname)
int size = clazzlist.size();
for(int i=0; ifindsubclass是用來找到某個類的合適子類,類似於spring中根據某種策略來查詢,這裡使用了比較簡單的方法。找到第乙個合適的子類即可。這個方法中,做了一些簡單的判斷,如果這個類本身就不是乙個抽象類或者不是乙個介面,那麼這個類就是第乙個合適的類。如果這個類是乙個介面或者乙個抽象類,那麼就在全域性掃瞄的classlist中找到合適的類。找到合適的類之後,下一步就是乙個注入了,筆者採用的是給setter方法注入,如果想直接給成員變數賦值也是非常簡單的。只要替換掉方法injectmethod,換成下面兩句**即可。
field[i].setaccessible(true);
field[i].set(target, obj);
Spring依賴的自動注入
一 準備類public inte ce userdao public class userdaoimpl implements userdao public class userdaoimpl2 implements userdao public inte ce userservice public...
剖析Spring自動注入中的註解
學習spring的自動注入時,對幾個註解非常模稜兩可,不知道使用的本質,只因為大家都這樣用,所以我一直這樣使用。下面列出 autowired和 resource這兩個註解他們的使用關係。在做範例之前,先介紹一下這兩個註解,下摘自的總結 spring 不但支援自己定義的 autowired註解,還支援...
剖析Spring自動注入中的註解
學習spring的自動注入時,對幾個註解非常模稜兩可,不知道使用的本質,只因為大家都這樣用,所以我一直這樣使用。下面列出 autowired和 resource這兩個註解他們的使用關係。在做範例之前,先介紹一下這兩個註解,下摘自的總結 spring 不但支援自己定義的 autowired註解,還支援...