1. 程式人生 > >通過簡單Spring事例理解SpringIOC思想

通過簡單Spring事例理解SpringIOC思想

  1. 首先,IOC與AOP獨立於Spring存在,只是Spring給出了IOC與AOP(AOP面向切面通過業務邏輯的分離,如:事務管理,許可權控制,日誌等,實現內聚開發)的具體實現,這裡重點總結IOC。
  2. 在總結IOC前,有必要說說第一個IOC的例子spring-hello:
    這裡寫圖片描述
    介面HelloApi中定義了一個方法叫做sayHello(); HelloImpl中給出了這個介面的實現:
    這裡寫圖片描述
    這裡寫圖片描述
    ApplicationContext.xml配置檔案:
    這裡寫圖片描述
    需要匯入的jar包:
    這裡寫圖片描述
    HelloTest測試:
    這裡寫圖片描述
    執行結果:
    這裡寫圖片描述
  3. 在測試方法中,並沒有像HelloApi helloApi = new HelloImpl()一樣new一個物件,而是從容器context中取出一個元件bean直接使用,這個元件的名字叫hello。這樣就好像是context這個bean容器幫我們實現了新建物件的過程,新建物件這個控制權不在程式設計師手上,所以這個過程叫做控制反轉
    ,這個context容器叫做SpringIOC容器。
  4. 這個簡單例子的操作或許看上去有點多餘了,首先要通過載入類路徑下的配置檔案applicationContext.xml初始化得到一個SpringIOC容器context(在配置檔案中給出了id為hello的元件bean的類為bit.HelloImpl的配置,容器context將這個實現好的類加入到容器中以待使用,這個過程叫依賴注入,是控制反轉的另一種理解方式),然後指定介面名與bean的id得到可以直接使用的相應物件。其實這個操作比直接new一個物件要複雜,但是為什麼還這麼做呢?
  5. 在回答上面這個問題時,要說說面向介面程式設計。為什麼要有面向介面程式設計?介面其實是一個規範,它是用來統一行為的標準。面向物件的一大特性為多型,通過介面的不同實現(implements)去實現多型。舉個例子:一個iAnimals的bark()介面,可以是cat叫,可以是dog叫還可以是bull叫,不同的動物叫聲肯定不一樣,這就對應了bark()介面應該有不同的實現(即多型)。上面提到了從context容器獲取元件hello時只需要指定它的介面,因為它的對應實現已經在配置檔案中給出配置,在實際程式設計邏輯中就不需要new impl(),比普通的介面程式設計少了new的操作。
  6. 少了new impl()有什麼好處呢?試想一種情況,在一個類中有3個方法都分別用到了HelloApi,普通的介面程式設計就是在3個方法中分別HelloApi helloApi = new HelloImpl();若有一天業務邏輯變更要將HelloApi的實現類換成HelloImpl2,這樣就要改3個地方,如果這個3是10000呢?就要改10000次。但通過SpringIOC容器,無論是3還是10000,只需要修改配置檔案的一處地方,將改成,實際程式設計邏輯中不需要做任何改動。
  7. 因此,對上面提到的做一個簡單總結就是:SpringIOC將配置資訊與實際程式設計邏輯很大程度上做了解耦,提高了開發與維護的效率。

補充說明:

  1. Bean就是由Spring容器初始化、裝配和管理的物件。
  2. SpringIOC容器的代表:BeanFactory(beans-config.xml),ApplicationContext(applicationContext.xml)。
  3. Spring採用依賴注入DI(配置檔案的書寫,bean關係的維護:設值等)來實現IOC
  4. DI:如果class A需要訪問class B的資訊,則說類A依賴於類B。Spring的IOC容器以依賴注入的方式實現了Bean物件之間關係的維護,由Bean容器負責組裝Bean之間的依賴關係(例如dataSource的rel)。
  5. (基於註解模式對Spring的理解)可以把在SpringIOC container自己注入的各個bean看作是平行等級分散的,需要A的時候從容器中裝載@Autowired進來不需要new操作直接使用,也不需要關心A它的依賴具體是什麼,Spring會基於註解自動掃描自行管理幫助例項化。