如何理解Spring中的IOC和AOP?
感謝邀請!
IOC1、什么是 IOC/DI ?
① IOC(Inversion of Control) 控制反轉:所謂控制反轉,就是把原先我們代碼里需要實現的對象創建、依賴的代碼,反轉給容器來來幫忙實現。那么必然的我們需要創建一個容器,同時需要一種描述來讓容器知道需要創建的對象與對象的關系。這種描述最具體表現就是我們的可配置文件。
② DI(Dependency Injection) 依賴注入: 就是指對象時被動接受依賴類而不是主動去找,歡聚話說 就是指對象不是從容器中查找它依賴的類,而是在容器實例化對象的時候主動將它依賴的類注入給它
2、如何理解IOC/DI
想要理解上面的概念,就必須搞清楚如下的問題:
① 參與者都是誰?
② 依賴: 誰依賴誰?為什么需要依賴?
③ 注入: 誰注入誰?到底注入什么?
④ 控制反轉:誰控制誰?控制什么?為何叫反轉?
⑤ 依賴注入和控制反轉是同一概念嗎?
下面我們來回答上面的問題:
(1) 參與者都有誰: 一個對象,IOC容器,被依賴的對象
(2) 誰依賴誰? 某個對象依賴IOC容器
(3) 為什么需要依賴: 對象需要IOC容器給其注入其需要的資源
(4) 誰注入誰?IOC容器注入某個對象
(5) 誰控制誰?IOC 容器 來控制對象的生命周期
(6) 控制什么?控制對象的創建、初始化、銷毀
(7) 為何叫反轉?
如果我們平常寫一個程序,如果A類中需要C對象,那么我們會直接new一個C對象,A類主動的去獲取C對象,這種情況叫做正向的。
什么叫反向呢?就是A類不主動去創建C,而是等IOC容器給A注入C。
3、控制反轉和 依賴注入是同一概念嗎?
依賴注入和控制反轉是對同一件事情的不同描述。
依賴注入是從程序方面講的: 應用程序依賴容器給我注入其所需要的資源。
控制反轉: 容器控制應用程序,由容器反向地向應用程序注入其所需要的資源。
AOP1、概念
面向切面編程,即AOP,是一種編程思想,它允許程序員對橫切關注點或橫切典型的職責分界線 的行為(例如日志和事務管理)進行模塊化。AOP的核心構造是方面(切面),它將那些影響多個類的行為封裝到可重用 的模塊中。
AOP的功能完全繼承到了Spring事務管理、日志和其他各種特性的上下文中。
2、核心概念
① 橫切關注點(對哪些方法進行切入):對哪些方法進行攔截,攔截后怎么處理,這些關注點稱為橫切關注點
②切面(Aspect) 把原來揉碎的業務邏輯中的非業務代碼抽取出來,把功能相同的放在一個類中形成一個切面
類是對物體特征的抽象,切面是對橫切關注點的抽象。
③ 連接點(joinpoint)(需要切入的點) :被 的攔截到的點,因為Spring只支持方法類型的連接點,所以Spring中連接點指的就是被攔截到的方法
④切入點(poincut):對連接點進行攔截的定義
⑤通知(Advice)
所謂通知指的就是指攔截到連接點之后要執行的代碼,通知分為前置、后置、異常、最終、環繞通知
⑥ 目標對象:代理的目標對象
⑦織入(weave)) :將切面應用到目標對象并導致代理對象創建的過程
⑧引入(introduction):在不修改代碼的 前提下,引入可以在運行期為類動態地添加一些方法或字段
3、常用場景
① Authentication權限認證
② Logging日志
③ Transctions Manager事務
④ Lazy Loading 懶加載
⑤ Context Process上下文處理
⑥ Error Handler錯誤跟蹤(異常捕獲機制)
⑦ Cache緩存
4. Spring AOP 底層是怎么實現的?
最終使用動態代理: JDK動態代理和CGlib動態代理
5、我們學Spring AOP 能需要什么?
自定義組件: 業務操作對象,可能要經過一系列的校驗操作
1、聲明一個一個校驗接口,定義校驗規則
1.1 寫一個抽象類(把公共的校驗規則寫在這里)
2、有多少種校驗規則類,就實現該接口
① 校驗規則有先后順序,定義order接口或者注解都可以,枚舉
② 業務類型--匹配我的規則 A業務只要123 B業務需要234
③ 依賴查找:
@Autowired
private Map<String,IDepence> depends;
Spring會自動把Idepence的實現類注入進去
④創建一個規則鏈對象