Spring自動注入的簡單實現

2021-09-17 04:42:29 字數 1828 閱讀 9496

申明:本文不是講解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註解,還支援...