目錄
一、若是沒有IOC,咱們的項目維護有什麼問題
二、IOC解決了什麼問題
3. 若是沒有AOP,咱們的項目維護有什麼問題
4. AOP解決了什麼問題
複製代碼
你們好,我是四九城最豪橫的小耳朵。java
今天我們來用大白話聊聊spring的IOC和AOP。程序員
一、若是沒有IOC,咱們的項目維護可能有哪些問題spring
日常咱們寫代碼,若是一個類ServiceA要調用另外一個類ServiceB的某個方法,就須要在類ServiceA的方法裏new一個類ServiceB的對象。框架
假如如今你有幾十個類都須要用到ServiceB的某個方法,那你就須要在幾十個類裏,都分別去new一個ServiceB的對象。spa
有一天,業務改了,你寫了一個新的類ServiceC,類ServiceB就廢棄不用了。那以前調用ServiceB的幾十個類,你就得把幾十個類中 「ServiceB b= new ServiceB ()」 的代碼改爲 「ServiceC c= new ServiceC ()」 了。那若是有一天,ServiceC也廢棄了,如今幾十個類又須要去調用ServiceD的方法了,你怎麼辦?還有,萬一你沒有替換完整怎麼辦,好比你漏掉了一處,那項目跑的時候又去調用對象ServiceC 的方法,但此時ServiceC 的邏輯已經廢棄了,是否是還有可能形成線上問題,產生髒數據啥的?3d
二、IOC解決了什麼問題代理
基於這種類和類徹底耦合在一塊兒的狀況,spring的IOC機制就應運而生了。日誌
假如如今你的項目引入了spring框架,那你如今仍是有同樣的需求,就是ServiceA裏仍是得調用ServiceB的某個方法,此時你的代碼就變成這樣了。code
你建立一個接口ServiceB,而後給它建立一個實現類ServiceBImpl。在ServiceA裏注入接口ServiceB。cdn
這個時候,當你的項目啓動的時候,Spring 容器在底層使用java的反射技術,去掃描項目中的Bean。
它首先發現類 ServiceA 裏引用了接口ServiceB,而後它去找如今是誰實現了接口ServiceB,它發現原來是類ServiceBImpl實現了接口ServiceB,此時根據這層依賴關係,它就會在類 ServiceA實例化一個ServiceBImpl的對象。
這樣作的好處是什麼呢?若是我如今類ServiceBImpl又廢棄了,類ServiceA須要去調用我新寫的ServiceC 的方法了,那我類A裏面的代碼「@Autowired private ServiceB b」還須要改嗎?根本不須要啊,我只須要讓新寫的ServiceC 去實現接口ServiceB 不就好了嗎,這樣一來Spring容器不就在類A的內部生成ServiceC 對象了嗎?
這樣一來,假如幾十個類都引用了接口ServiceB,我也只須要讓ServiceC 實現接口ServiceB 而已,根本不用改幾十個類中的相關引用代碼塊了。
也就是說,IOC,也稱依賴注入,就是Spring容器用反射技術,根據註解或配置文件去建立Bean, 而後根據Bean之間的依賴和引入關係,去實例化對應的對象,實現了類和類之間完全的解耦。你建立個接口,而後有個實現類A,別的類引用了A裏的邏輯,後邊A廢棄了,你就能夠建立個類B,讓它實現接口,只須要作這麼一步而已,不像以前那樣,你還得把每一個類中「A a = new A()」的代碼都改爲「B b = new B()」了。
說完IOC,再來講說AOP。
好久之前,我大學的時候,老師教的JSP+Servlet項目,每次要作增刪改查的時候,一個方法裏都得在開頭寫「開啓事務」等等固定代碼,結尾的地方都得寫「提交事務」等固定代碼。
天哪,你想一想,這麼多重複的代碼,毫無美感可言。
再舉個例子,公司如今讓你作一個日誌模塊,就是把全部增刪改的操做都記錄到一張表中。你一看需求,嗨簡單,爲了快點實現功能,你在每一個增刪改的方法後面都寫了一堆固定的代碼,調用方法A獲得當前用戶,而後調用Dao A把數據寫到日誌表裏。
而後你寫完項目上線了。過了幾天,方法A和Dao A廢棄了,你得調用方法B和Dao B了!那你怎麼辦?只能去一個個方法裏改代碼了!可是萬一你漏改一處怎麼辦,上線後確定會有問題啊!
基於上面重複代碼的問題,AOP就應運而生了。
如今咱們用Spring框架寫代碼,遇到增刪改,會直接在方法的上面加個事務註解@Transcational,而後直接寫咱們本身的業務邏輯就行。實際上,在底層,Spring容器它但是使用動態代理技術,給咱們方法上加了@Transcational註解的類,去生成了一個動態代理類的。這個動態代理類實現了你的類的全部方法。
這個代理類會給每一個實現的方法中織入一些加強代碼。好比類A中的方法A上面加了事務註解@Transcational,那動態代理生成的代理類ProxyA的方法A,就會在方法開頭織入「開啓事務」等等的固定代碼,在結尾處織入「提交事務」的固定代碼。
這麼一來,就能夠避免最開始 JSP + Servlet項目那種重複的「開啓事務」、「提交事務」的代碼塊了。
用AOP作項目的日誌記錄也是同樣的原理,AOP,就是經過動態代理技術生成類的一個動態代理類,這個動態代理類實現了你的類的全部方法,而後根據你的註解,給每一個方法織入一些加強代碼。從而避免了項目中大量重複代碼,一改就得改幾十個方法的問題了。
End
複製代碼
做者簡介:豪橫的小耳朵,一個豪橫的程序員。想和你們一塊兒在技術的世界裏豪橫,用技術的眼光去看待世界。歡迎掃描下方二維碼,持續關注,一大波原創系列文章正在路上