Spring 核心IOC+AOP讀書筆記
spring框架成功來源於概念,它的理念包括ioc (控制反轉)和aop(面相切面程式設計) ioc相當於一個容器,在spring中認為一切資源都是JavaBean,spring ioc管理物件和其依賴關係,採用的不是人為的主動建立,,由spring ioc自己描述建立,也就是說spring是依靠描述來完成物件的建立及其依賴關係。
spring ioc 的實際應用(解決的問題):
以人使用插座為例:
人 國家標準插座介面 插座1 插座2
使用插座1程式碼:
Socket socket = new Socket1();
user.setSocket(socket);
user.useSocket();
使用插座2程式碼:
Socket socket = new Socket2();
user.setSocket(socket);
user.useSocket();
問題:專案中Socket 介面和實現類Socket1耦合,如果不在使用socket1,時要修改程式碼。
解決:springioc解決了這個問題,不用new 的方式建立物件,而是使用xml配置的方式
<bean id="socket" class="socket1"/> <bean id="user" class="xxx.User"> <Property name= "socket" ref="socket"/> </bean> //如果要替換插座2,只需要通過配置切換 <bean id="socket" class="socket2"/>
springAop的思想:在運動時,動態的講程式碼切入到類的指定方法,指定位置的程式設計思想就是面向切面程式設計。
spring AOP:ioc的目標是管理bean,而Bean是Java面相物件(oop),的基礎設計的,有些問題面相物件無法處理,如生:產
產部門的訂單,生產部門,財務部門,(三者符合面相物件設計)訂單發出,生產部門審批通過,準備付款,但是財務部門發現
訂單的價格超支了,需要 取消訂單,訂單的超支限定已經不僅僅影響財務部門,生產部門之前的審批也要作廢,我們把預算超支這個條件稱為切面。他影響了訂單,生產部門,財務部門,三個OOP物件。在現實生活中,這樣的切面條件跨越了3個或者更多
切面條件影響流程。
Spring AOP 常用於資料庫事物的程式設計,很多情況下,我們在資料庫更新後,不知道下一步是否會成功,如果失敗會根據資料庫回滾功能回滾事物,第一步資料庫更新也作廢,Spring AOP 實現事物管理,是以異常作為訊息機制,,只要Spring接受到異常資訊,就會回滾事物,不需要程式碼來實現這個過程。保證資料庫一致性。
面向物件的特點是繼承,封裝和多型。分裝就是要求將功能分散到不同的物件中,讓不同的類設計不同放入方法,這樣程式碼分散到一個的類中去了,這樣的好處是降低了程式碼的複雜程度,使類可以服用。
這樣在分散程式碼的同時,也增加了程式碼的重複性。如在兩個類中,可能需要在每個方法中做日誌,按照面向物件的設計方法,兩個類中的方法中都要加入日誌的內容。也許他們是完全相同的。但是因為面向物件的設計,讓類與類之間無法聯絡。不能講這些重複的程式碼統一起來。如果將這段程式碼寫在一個獨立的方法裡,然後在這兩個類中呼叫,那麼獨立類之間就有耦合,日類的改變會影響到這兩個類。
AOP面向切面程式設計思想的概念:
把邏輯程式碼和處理瑣碎事物 的程式碼分離開,以便能過分離複雜度,讓人在同一時間只考慮程式碼邏輯,或者瑣碎事物(程式碼邏輯如:插入一條資料,那麼瑣碎事務就包括獲取連線和關閉連線,食物開始,事物提交)
以下是切面的概念:
一般我們管切入到指定類指定方法的大堆繁瑣事物中的的邏輯程式碼片段稱之為切面,而切入到哪些類哪些方法則叫切入點。
@Aspect
@Pointcut
@Before
@Around
@After
然後舉個例子:
先假設你有一段邏輯程式碼要寫~ 在這段程式碼之前要寫log;程式碼完成之後要寫log。結局就是一大堆的log程式碼就淹沒了邏輯程式碼。
aop的想法就是將非邏輯部分的程式碼抽離出來,只考慮邏輯程式碼就行了,我把框框畫好,這裡寫前面的log,這裡寫邏輯,這裡寫後面的log。
有了aop我們可以把幾個類共有的程式碼,抽取到一個切片中,需要時在切入到物件中去,從而改變其原有的行為。這樣一來AOP其實只是OOP的補充而已OOP從橫向上區分出一個個類來,而AOP則縱向上向物件中加入特定額程式碼有了AOP,OOP變得更加立體,AOP基本上是通過動態代理機制實現的。