IOC和AOP不是Spring提出的,在spring之前就已經(jīng)存在,只不過更偏向于理論化,Spring在技術(shù)層次把這兩個思想做了?常好的實現(xiàn)(Java)。
IOC(Inversion of Control)
什么是IoC?
IoC Inversion of Control (控制反轉(zhuǎn)/反轉(zhuǎn)控制),注意它是?個技術(shù)思想,不是?個技術(shù)實現(xiàn)。
描述的事情:Java開發(fā)領(lǐng)域?qū)ο蟮膭?chuàng)建,管理的問題
傳統(tǒng)開發(fā)?式:?如類A依賴于類B,往往會在類A中new?個B的對象
IoC思想下開發(fā)?式:我們不???去new對象了,?是由IoC容器(Spring框架)去幫助我們實例化對象并且管理它,我們需要使?哪個對象,去問IoC容器要即可。
我們喪失了?個權(quán)利(創(chuàng)建、管理對象的權(quán)利),得到了?個福利(不?考慮對象的創(chuàng)建、管理等?系列事情)
為什么叫做控制反轉(zhuǎn)?控制
:指的是對象創(chuàng)建(實例化、管理)的權(quán)利反轉(zhuǎn)
:控制權(quán)交給外部環(huán)境了(spring框架、IoC容器)
IoC解決了什么問題
IoC解決對象之間的耦合
問題
IoC和DI的區(qū)別
DI:Dependancy Injection(依賴注?)
怎么理解:
IOC和DI描述的是同?件事情,只不過?度不?樣罷了。
AOP(Aspect oriented Programming)
什么是AOP
AOP: AOP
為 Aspect Oriented Programming
的縮寫,意思為面向切面編程,是通過預(yù)編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術(shù)。AOP
是 OOP
的延續(xù),是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對業(yè)務(wù)邏輯的各個部分進行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。
既然AOP是OOP的延續(xù),我們從OOP說起,OOP
全稱Object-Oriented Programming
(面向?qū)ο缶幊蹋?。OOP是一種常用的編程范式,它以對象為核心,通過封裝
、繼承
和多態(tài)
等概念來組織和管理代碼。面向?qū)ο缶幊烫峁┝艘环N結(jié)構(gòu)化和模塊化的方法,使得我們能夠更好地組織和復(fù)用代碼。
OOP是?種垂直繼承體系。
OOP編程思想可以解決?多數(shù)的代碼重復(fù)問題,但是有?些情況是處理不了的,?如在頂級?類Animal中的多個?法中相同位置出現(xiàn)了重復(fù)代碼,OOP就解決不了。
橫切邏輯代碼:
橫切邏輯代碼存在什么問題:
- 橫切代碼重復(fù)問題
- 橫切邏輯代碼和業(yè)務(wù)代碼混雜在?起,代碼臃腫,維護不?便
AOP
出場,AOP獨辟蹊徑提出橫向抽取機制,將橫切邏輯代碼和業(yè)務(wù)邏輯代碼分離。
代碼拆分容易,那么如何在不改變原有業(yè)務(wù)邏輯的情況下,悄?聲息的把橫切邏輯代碼應(yīng)?到原有的業(yè)務(wù)邏輯中,達到和原來?樣的效果,這個是?較難的。
AOP在解決什么問題
在不改變原有業(yè)務(wù)邏輯情況下,增強橫切邏輯代碼,根本上解耦合,避免橫切邏輯代碼重復(fù)。
為什么叫做?向切?編程
「切」:指的是橫切邏輯,原有業(yè)務(wù)邏輯代碼我們不能動,只能操作橫切邏輯代碼,所以?向橫切邏輯
「?」:橫切邏輯代碼往往要影響的是很多個?法,每?個?法都如同?個點,多個點構(gòu)成?,有?個?的概念在??。
AOP 的底層實現(xiàn)
實際上,AOP 的底層是通過 Spring 提供的的動態(tài)代理技術(shù)實現(xiàn)的。在運行期間,Spring通過動態(tài)代理技術(shù)動態(tài)的生成代理對象,代理對象方法執(zhí)行時進行增強功能的介入,在去調(diào)用目標對象的方法,從而完成功能的增強。
AOP 的動態(tài)代理技術(shù)
常用的動態(tài)代理技術(shù)
-
JDK
代理 : 基于接口
的動態(tài)代理技術(shù) -
cglib
代理:基于父類
的動態(tài)代理技術(shù)
JDK 的動態(tài)代理
JDK的動態(tài)代理實現(xiàn)如下:
- 創(chuàng)建目標類接口:
public interface TargetInterface {
public void method();
}
- 目標類
public class Target implements TargetInterface {
@Override
public void method() {
System.out.println("Target running....");
}
}
- 動態(tài)代理代碼
Target target = new Target(); //創(chuàng)建目標對象
//創(chuàng)建代理對象
TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(target.getClass()
.getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("前置增強代碼...");
Object invoke = method.invoke(target, args);
System.out.println("后置增強代碼...");
return invoke;
}
}
);
- 調(diào)用代理對象的方法測試驗證:
// 測試,當調(diào)用接口的任何方法時,代理對象的代碼都無序修改
proxy.method();
輸出如下:
cglib 的動態(tài)代理
cglib 的動態(tài)代理實現(xiàn)如下:
- 創(chuàng)建目標類:
public class Target {
public void method() {
System.out.println("Target running....");
}
}
- 動態(tài)代理代碼
Target target = new Target(); //創(chuàng)建目標對象
Enhancer enhancer = new Enhancer(); //創(chuàng)建增強器
enhancer.setSuperclass(Target.class); //設(shè)置父類
enhancer.setCallback(new MethodInterceptor() { //設(shè)置回調(diào)
@Override
public Object intercept(Object o, Method method, Object[] objects,
MethodProxy methodProxy) throws Throwable {
System.out.println("前置代碼增強....");
Object invoke = method.invoke(target, objects);
System.out.println("后置代碼增強....");
return invoke;
}
});
Target proxy = (Target) enhancer.create(); //創(chuàng)建代理對象
- 調(diào)用代理對象的方法測試
//測試,當調(diào)用接口的任何方法時,代理對象的代碼都無序修改
proxy.method();
默認情況下,Spring會根據(jù)被代理對象是否實現(xiàn)接?
來選擇使?JDK還是CGLIB。當被代理對象沒有實現(xiàn)任何接?時,Spring會選擇CGLIB。當被代理對象實現(xiàn)了接?,Spring會選擇JDK官?的代理技術(shù),不過我們可以通過配置的?式,讓Spring強制使?CGLIB。
AOP 相關(guān)概念
Spring 的 AOP 實現(xiàn)底層就是對上面的動態(tài)代理的代碼進行了封裝,封裝后我們只需要對需要關(guān)注的部分進行代碼編寫,并通過配置的方式完成指定目標的方法增強。
后續(xù)我會講解AOP的操作,在此之前我們必須理解 AOP 的相關(guān)術(shù)語,常用的術(shù)語如下:
-
Target(目標對象)
:代理的目標對象 -
Proxy (代理)
:一個類被 AOP 織入增強后,就產(chǎn)生一個結(jié)果代理類 -
Joinpoint(連接點)
:所謂連接點是指那些被攔截到的點。在spring中,這些點指的是方法,因為spring只支持方法類型的連接點 -
Pointcut(切入點)
:所謂切入點是指我們要對哪些 Joinpoint 進行攔截的定義 -
Advice(通知/ 增強)
:所謂通知是指攔截到 Joinpoint 之后所要做的事情就是通知 -
Aspect(切面)
:是切入點和通知(引介)的結(jié)合 -
Weaving(織入)
:是指把增強應(yīng)用到目標對象來創(chuàng)建新的代理對象的過程。spring采用動態(tài)代理織入,而AspectJ采用編譯期織入和類裝載期織入
常見應(yīng)用場景
-
日志記錄
:AOP可用于在方法調(diào)用前后記錄日志。這對于系統(tǒng)的調(diào)試、錯誤排查以及性能分析都非常有用。通過在切面中編寫日志記錄邏輯,可以捕獲方法的參數(shù)、返回值和執(zhí)行時間等信息,并將其記錄到日志文件或其他目標中。 -
安全性控制
:AOP可用于實現(xiàn)安全性控制,如身份驗證、權(quán)限驗證和訪問控制等。通過在切面中編寫安全性邏輯,可以在方法調(diào)用前檢查用戶的身份和權(quán)限,從而確保只有合法用戶才能執(zhí)行敏感操作。 -
事務(wù)管理
:AOP廣泛應(yīng)用于事務(wù)管理,確保數(shù)據(jù)庫操作的一致性和完整性。通過在切面中應(yīng)用事務(wù)邏輯,可以在方法調(diào)用前后自動開啟、提交或回滾事務(wù)。這樣,開發(fā)者無需手動編寫事務(wù)管理代碼,而是將關(guān)注點集中在業(yè)務(wù)邏輯上。 -
緩存管理
:AOP可用于實現(xiàn)緩存管理,提高系統(tǒng)的性能和響應(yīng)速度。通過在切面中添加緩存邏輯,可以在方法執(zhí)行前檢查緩存是否包含所需數(shù)據(jù),避免執(zhí)行相同的方法調(diào)用。如果緩存中存在數(shù)據(jù),則直接返回緩存數(shù)據(jù),減少對底層存儲系統(tǒng)的訪問。 -
異常處理
:AOP可用于捕獲和處理方法調(diào)用過程中的異常情況。通過在切面中編寫異常處理邏輯,可以記錄異常信息、發(fā)送通知或執(zhí)行特定的異常處理策略。這有助于更好地理解和響應(yīng)系統(tǒng)中發(fā)生的異常情況。 -
性能監(jiān)控
:AOP可用于監(jiān)控方法的性能指標,以便進行性能分析和優(yōu)化。通過在切面中添加性能監(jiān)控邏輯,可以記錄方法的執(zhí)行時間、調(diào)用次數(shù)和資源消耗等指標。這樣可以識別系統(tǒng)中的性能瓶頸,并采取相應(yīng)的優(yōu)化措施。
總之,Spring AOP提供了一種模塊化的方式來處理橫切關(guān)注點,使開發(fā)者能夠更好地關(guān)注核心業(yè)務(wù)邏輯。通過在切面中編寫特定的邏輯,可以在方法調(diào)用的不同階段插入通用的橫切行為,提高代碼的可維護性和重用性。
本文內(nèi)容到此結(jié)束了,
如有收獲歡迎點贊??收藏??關(guān)注??,您的鼓勵是我最大的動力。
如有錯誤?疑問??歡迎各位指出。
主頁:共飲一杯無的博客匯總?????文章來源:http://www.zghlxwxcb.cn/news/detail-492639.html保持熱愛,奔赴下一場山海。??????文章來源地址http://www.zghlxwxcb.cn/news/detail-492639.html
到了這里,關(guān)于Spring核心思想之IOC和AOP的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!