依賴注入介紹
成都創(chuàng)新互聯(lián),專注為中小企業(yè)提供官網(wǎng)建設(shè)、營銷型網(wǎng)站制作、成都響應(yīng)式網(wǎng)站建設(shè)公司、展示型成都網(wǎng)站制作、成都網(wǎng)站建設(shè)等服務(wù),幫助中小企業(yè)通過網(wǎng)站體現(xiàn)價(jià)值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設(shè)與網(wǎng)站營銷推廣問題。
先回顧下依賴注入的概念:
我們常提起的依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色(可能是一個(gè)Java實(shí)例,調(diào)用者)需要另一個(gè)角色(另一個(gè)Java實(shí)例,被調(diào)用者)的協(xié)助時(shí),在 傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例。但在Spring里,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn);創(chuàng)建被調(diào)用者 實(shí)例的工作通常由Spring容器來完成,然后注入調(diào)用者,因此也稱為依賴注入。
其實(shí)簡單的說,依賴注入起到的作用就是講對象之間的依賴關(guān)系從原先的代碼中解耦出來,通過配置文件或注解等方式加上Spring框架的處理讓我們對依賴關(guān)系靈活集中的進(jìn)行管理。
依賴注入框架
依賴注入框架并不神秘,其實(shí)它是非常簡單的東西。不要去看spring的依賴注入源碼,因?yàn)槟阒灰蝗タ淳鸵馕吨阍僖矊懖桓蚁率肿约簲]了,它的功能因?yàn)檫^于強(qiáng)大,所以設(shè)計(jì)也過于復(fù)雜,普通程序員一眼看去只能望洋興嘆。
我也并沒有去細(xì)致閱讀spring源碼。即便如此也只用了半天的時(shí)間便自己擼了一個(gè)基本滿足標(biāo)準(zhǔn)依賴注入規(guī)范「JSR-330」的小框架iockids。這個(gè)小框架只有一個(gè)主類Injector,大約200行代碼,它具備以下功能。
我們看一個(gè)稍微復(fù)雜一點(diǎn)的使用示例
import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; import iockids.Injector; @Singleton class Root { @Inject @Named("a") Node a; @Inject @Named("b") Node b; @Override public String toString() { return String.format("root(%s, %s)", a.name(), b.name()); } } interface Node { String name(); } @Singleton @Named("a") class NodeA implements Node { @Inject Leaf leaf; @Inject @Named("b") Node b; @Override public String name() { if (b == null) return String.format("nodeA(%s)", leaf); else return String.format("nodeAWithB(%s)", leaf); } } @Singleton @Named("b") class NodeB implements Node { Leaf leaf; @Inject @Named("a") Node a; @Inject public NodeB(Leaf leaf) { this.leaf = leaf; } @Override public String name() { if (a == null) return String.format("nodeB(%s)", leaf); else return String.format("nodeBWithA(%s)", leaf); } } class Leaf { @Inject Root root; int index; static int sequence; public Leaf() { index = sequence++; } public String toString() { if (root == null) return "leaf" + index; else return "leafwithroot" + index; } } public class Demo { public static void main(String[] args) { var injector = new Injector(); injector.registerQualifiedClass(Node.class, NodeA.class); injector.registerQualifiedClass(Node.class, NodeB.class); var root = injector.getInstance(Root.class); System.out.println(root); } }
上面這份代碼用到了iockids提供的所有功能。
為了便于理解上述代碼,我畫了依賴圖
上面的代碼輸出如下
root(nodeAWithB(leafwithroot0), nodeBWithA(leafwithroot1))
從這個(gè)輸出中,我們也可以大致想象出依賴結(jié)構(gòu)。
iockids提供了豐富的注入錯(cuò)誤異常報(bào)告,防止用戶注入配置出錯(cuò)。
比如我們將上面的NodeA和NodeB的名稱都配置成一樣的a,就會(huì)曝出下面的錯(cuò)誤堆棧
iockids.InjectException: duplicated qualifier javax.inject.Named with the same class iockids.demo.Node at iockids.Injector.registerQualifiedClass(Injector.java:87) at iockids.Injector.registerQualifiedClass(Injector.java:70) at iockids.demo.Demo.main(Demo.java:106)
如果我們將NodeB的構(gòu)造器隨意加一個(gè)參數(shù)
@Inject public NodeB(Leaf leaf, int k) { this.leaf = leaf; }
運(yùn)行時(shí)就會(huì)拋出下面的錯(cuò)誤
iockids.InjectException: no accessible constructor for injection class int at iockids.Injector.createNew(Injector.java:120) at iockids.Injector.createNew(Injector.java:94) at iockids.Injector.createFromParameter(Injector.java:167) at iockids.Injector.createFromConstructor(Injector.java:145) at iockids.Injector.createNew(Injector.java:123) at iockids.Injector.createFromQualified(Injector.java:216) at iockids.Injector.createFromField(Injector.java:173) at iockids.Injector.injectMembers(Injector.java:233) at iockids.Injector.createNew(Injector.java:136) at iockids.Injector.createFromQualified(Injector.java:216) at iockids.Injector.createFromField(Injector.java:173) at iockids.Injector.injectMembers(Injector.java:233) at iockids.Injector.createNew(Injector.java:136) at iockids.Injector.createNew(Injector.java:94) at iockids.Injector.getInstance(Injector.java:245) at iockids.demo.Demo.main(Demo.java:107)
項(xiàng)目開源地址:https://github.com/pyloque/iockids (本地下載)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。
分享名稱:200行Java代碼如何實(shí)現(xiàn)依賴注入框架詳解
標(biāo)題路徑:http://aaarwkj.com/article8/ijhsop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、電子商務(wù)、定制網(wǎng)站、虛擬主機(jī)、靜態(tài)網(wǎng)站、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)