IOC和AOP是spring中的兩個核心的概念,下面談談對這兩個概念的理解。
阿新 • • 發佈:2019-02-11
IOC和AOP是spring中的兩個核心的概念,下面談談對這兩個概念的理解。
1. IOC(Inverse of Control):控制反轉,也可以稱為依賴倒置。
形象的舉例就是:
通常情況下,假如你有一天在家裡口渴了,要喝水,那麼你可以到你小區的小賣部去,告訴他們,你需要一瓶水,然後小賣部給你一瓶水!這本來沒有太大問題,關鍵是如果小賣部很遠,那麼你必須知道:從你家如何到小賣部;小賣部裡是否有你需要的水;你還要考慮是否開著車去;等等等等,也許有太多的問題要考慮了。也就是說,為了一瓶水,你還可能需要依賴於車等等這些交通工具或別的工具,問題是不是變得複雜了?那麼如何解決這個問題呢?
解決這個問題的方法很簡單:小賣部提供送貨上門服務,凡是小賣部的會員,你只要告知小賣部你需要什麼,小賣部將主動把貨物給你送上門來!這樣一來,你只需要做兩件事情,你就可以活得更加輕鬆自在:
第一:向小賣部註冊為會員。
第二:告訴小賣部你需要什麼。
這和Spring的做法很類似!Spring就是小賣部,你就是A物件,水就是B物件
第一:在Spring中宣告一個類:A
第二:告訴Spring,A需要B
假設A是UserAction類,而B是UserService類
- <beanid="userService"class="org.leadfar.service.UserService"/>
- <beanid="documentService"class="org.leadfar.service.DocumentService"/>
- <beanid="orgService"class="org.leadfar.service.OrgService"/>
- <beanid="userAction"class="org.leadfar.web.UserAction">
-
<propertyname="userService"
- </bean>
在Spring這個商店(工廠)中,有很多物件/服務:userService,documentService,orgService,也有很多會員:userAction等等,宣告userAction需要userService即可,Spring將通過你給它提供的通道主動把userService送上門來,因此UserAction的程式碼示例類似如下所示:
- package org.leadfar.web;
- publicclass UserAction{
-
private UserService userService;
- public String login(){
- userService.valifyUser(xxx);
- }
- publicvoid setUserService(UserService userService){
- this.userService = userService;
- }
- }
在這段程式碼裡面,你無需自己建立UserService物件(Spring作為背後無形的手,把UserService物件通過你定義的setUserService()方法把它主動送給了你,這就叫依賴注入!),當然咯,我們也可以使用註解來注入。Spring依賴注入的實現技術是:動態代理
2. AOP:即面向切面程式設計
面向切面程式設計的目標就是分離關注點。什麼是關注點呢?就是你要做的事,就是關注點。假如你是個公子哥,沒啥人生目標,天天就是衣來伸手,飯來張口,整天只知道玩一件事!那麼,每天你一睜眼,就光想著吃完飯就去玩(你必須要做的事),但是在玩之前,你還需要穿衣服、穿鞋子、疊好被子、做飯等等等等事情,這些事情就是你的關注點,但是你只想吃飯然後玩,那麼怎麼辦呢?這些事情通通交給別人去幹。在你走到飯桌之前,有一個專門的僕人A幫你穿衣服,僕人B幫你穿鞋子,僕人C幫你疊好被子,僕人C幫你做飯,然後你就開始吃飯、去玩(這就是你一天的正事),你幹完你的正事之後,回來,然後一系列僕人又開始幫你幹這個幹那個,然後一天就結束了!
AOP的好處就是你只需要幹你的正事,其它事情別人幫你幹。也許有一天,你想裸奔,不想穿衣服,那麼你把僕人A解僱就是了!也許有一天,出門之前你還想帶點錢,那麼你再僱一個僕人D專門幫你幹取錢的活!這就是AOP。每個人各司其職,靈活組合,達到一種可配置的、可插拔的程式結構。從Spring的角度看,AOP最大的用途就在於提供了事務管理的能力。事務管理就是一個關注點,你的正事就是去訪問資料庫,而你不想管事務(太煩),所以,Spring在你訪問資料庫之前,自動幫你開啟事務,當你訪問資料庫結束之後,自動幫你提交/回滾事務!