依賴注入介紹
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比卡若網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式卡若網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋卡若地區(qū)。費用合理售后完善,10年實體公司更值得信賴。先回顧下依賴注入的概念:
我們常提起的依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個概念。具體含義是:當(dāng)某個角色(可能是一個Java實例,調(diào)用者)需要另一個角色(另一個Java實例,被調(diào)用者)的協(xié)助時,在 傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例。但在Spring里,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn);創(chuàng)建被調(diào)用者 實例的工作通常由Spring容器來完成,然后注入調(diào)用者,因此也稱為依賴注入。
其實簡單的說,依賴注入起到的作用就是講對象之間的依賴關(guān)系從原先的代碼中解耦出來,通過配置文件或注解等方式加上Spring框架的處理讓我們對依賴關(guān)系靈活集中的進(jìn)行管理。
依賴注入框架
依賴注入框架并不神秘,其實它是非常簡單的東西。不要去看spring的依賴注入源碼,因為你只要一去看就意味著你再也寫不敢下手自己擼了,它的功能因為過于強(qiáng)大,所以設(shè)計也過于復(fù)雜,普通程序員一眼看去只能望洋興嘆。
我也并沒有去細(xì)致閱讀spring源碼。即便如此也只用了半天的時間便自己擼了一個基本滿足標(biāo)準(zhǔn)依賴注入規(guī)范「JSR-330」的小框架iockids。這個小框架只有一個主類Injector,大約200行代碼,它具備以下功能。
我們看一個稍微復(fù)雜一點的使用示例
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); } }