IoC(Inversion of Control)中文名叫控制反轉,就是應用自己不負責依賴對象的建立及維護,依賴對象的建立及維護是由外部 容器負責的。這樣控制權就由應用轉移到了外部容器,控制權的轉移就是所謂反轉,IoC也叫DI,依賴注入,容器負責把依賴的具 體對象注入到上層對象,而上層對象只須要提供一個接口聲明。相似於hibernate 一對多關係裏面的inverse,把關係維護的重 任交給對方,本身專心業務,與對方如何變化無關,所有由對方(spring容器)來進行維護。 所謂依賴,從程序的角度看,就是好比A要調用B的方法,那麼A就依賴於B,反正A要用到B,則A依賴於B。 所謂倒置,你必須理解若是不倒置,會怎麼着,由於A必需要有B,才能夠調用B,若是不倒置,意思就是A主動獲取B的實例:B b = new B(),這就是最簡單的獲取B實例的方法(固然還有各類設計模式能夠幫助你去得到B的實例,好比工廠、Locator等等),而後你就能夠調用b對象了。 因此,不倒置,意味着A要主動獲取B,才能使用B;到了這裏,你就應該明白了倒置的意思了。倒置就是A要調用B的話,A並不須要主動獲取B,而是由其它人自動將B送上門來。 形象的舉例就是: 一般狀況下,假如你有一天在家裏口渴了,要喝水,那麼你能夠到你小區的小賣部去,告訴他們,你須要一瓶水,而後小賣部給你一瓶水! 這原本沒有太大問題,關鍵是若是小賣部很遠,那麼你必須知道:從你家如何到小賣部;小賣部裏是否有你須要的水;你還要考慮是否開着車去;等等等等,也許有太多的問題要考慮了。也就是說,爲了一瓶水,你還可能須要依賴於車等等這些交通工具或別的工具,問題是否是變得複雜了?那麼如何解決這個問題呢? 解決這個問題的方法很簡單:小賣部提供送貨上門服務,凡是小賣部的會員,你只要告知小賣部你須要什麼,小賣部將主動把貨物給你送上門來!這樣一來,你只須要作兩件事情,你就能夠活得更加輕鬆自在: 第一:向小賣部註冊爲會員 第二:告訴小賣部你須要什麼 是否是和Spring的作法很相似呢?Spring就是小賣部,你就是A對象,水就是B對象 第一:在Spring中聲明一個類:A 第二:告訴Spring,A須要B 假設A是UserAction類,而B是UserService類 <bean id="userService" class="org.leadfar.service.UserService"/> <bean id="documentService" class="org.leadfar.service.DocumentService"/> <bean id="orgService" class="org.leadfar.service.OrgService"/> <bean id="userAction" class="org.leadfar.web.UserAction"> <property name="userService" ref="userService"/> </bean> 在Spring這個商店(工廠)中,有不少對象/服務:userService,documentService,orgService,也有不少會員:userAction等等,聲明userAction須要userService便可,Spring將經過你給它提供的通道主動把userService送上門來,所以UserAction的代碼示例相似以下所示: package org.leadfar.web; public class UserAction{ private UserService userService; public String login(){ userService.valifyUser(xxx); } public void setUserService(UserService userService){ this.userService = userService; } } 在這段代碼裏面,你無需本身建立UserService對象(Spring做爲背後無形的手,把UserService對象經過你定義的setUserService()方法把它主動送給了你,這就叫依賴注入!) Spring依賴注入的實現技術是:動態代理 --------------------------------------------------- 再說說AOP,即面向切面編程,面向切面編程的目標就是分離關注點。什麼是關注點呢,就是你要作的事,就是關注點。假如你是個公子哥,沒啥人生目標,每天就是衣來伸手,飯來張口,成天只知道玩一件事!那麼,天天你一睜眼,就光想着吃完飯就去玩(你必需要作的事),可是在玩以前,你還須要穿衣服、穿鞋子、疊好被子、作飯等等等等事情,這些事情就是你的關注點,可是你只想吃飯而後玩,那麼怎麼辦呢?這些事情統統交給別人去幹。在你走到飯桌以前,有一個專門的僕人A幫你穿衣服,僕人B幫你穿鞋子,僕人C幫你疊好被子,僕人C幫你作飯,而後你就開始吃飯、去玩(這就是你一天的正事),你幹完你的正事以後,回來,而後一系列僕人又開始幫你幹這個幹那個,而後一天就結束了! AOP的好處就是你只須要幹你的正事,其它事情別人幫你幹。也許有一天,你想裸奔,不想穿衣服,那麼你把僕人A解僱就是了!也許有一天,出門以前你還想帶點錢,那麼你再僱一個僕人D專門幫你幹取錢的活!這就是AOP。每一個人各司其職,靈活組合,達到一種可配置的、可插拔的程序結構。 從Spring的角度看,AOP最大的用途就在於提供了事務管理的能力。事務管理就是一個關注點,你的正事就是去訪問數據庫,而你不想管事務(太煩),因此,Spring在你訪問數據庫以前,自動幫你開啓事務,當你訪問數據庫結束以後,自動幫你提交/回滾事務!