6. AOP
? ??6.1?什么是AOP編程弃鸦?
? ? 6.2 實現(xiàn)方式:
? ??6.3 裝飾者模式與靜態(tài)代理對比:
? ??6.4 動態(tài)代理
7. aspectj(基于XML的AOP配置)
? ??7.1 安裝與xml約束
? ??7.2 AccountServiceImpl 與 Logger??
? ? 7.3 切入點表達(dá)式
? ??7.4 spring 通知(前置曲楚、后置、環(huán)繞、異常鹃操、最終)
8. aspectj(基于注解的AOP配置)
? ??@EnableAspectJAutoProxy 啟用aop
? ??@Aspect
? ??@Pointcut("execution(* com.itheima.service.impl.*.*(..))")
????@Before("pt1()")@AfterReturning("pt1()")@AfterThrowing("pt1()")@After("pt1()")@Around("pt1()")
6. AOP
????6.1?什么是AOP編程韭寸?
????????AOP:面向切面編程,在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加功能荆隘。在代碼階段實現(xiàn)分離關(guān)注恩伺,松耦合。然后在運行時將相關(guān)動作特征植入運行椰拒,從而改變程序的運行順序晶渠,達(dá)到攔截或者增加功能的目的。
? ? 6.2 實現(xiàn)方式:
????????1.預(yù)編譯方式(在編譯期燃观、類加載期織入)褒脯,例如AspectJ(解析切入點表達(dá)式)
? ? ? ? 2.運行期使用動態(tài)代理,例如Spring AOP分為jdk代理和CGLIB代理兩種方式
? ? 6.3 裝飾者模式與靜態(tài)代理對比:
????????裝飾模式:以對客戶端透明的方式擴(kuò)展對象的功能缆毁,是繼承關(guān)系的一個替代方案番川;(增強,傳入對象)
????????代理模式:給一個對象提供一個代理對象脊框,并有代理對象來控制對原有對象的引用颁督;(控制,new class)
? ? 6.4 動態(tài)代理
? ??????特點:字節(jié)碼隨用隨創(chuàng)建浇雹,隨用隨加載? ?
? ??????作用:不修改源碼的基礎(chǔ)上對方法增強
? ??????分類:1.基于接口的動態(tài)代理 Proxy.newProxyInstance (代理對象必須實現(xiàn)1個接口)
? ? ? ? ? ? ? ? ? ?2.基于子類的動態(tài)代理 cglib
? ??????newProxyInstance()
? ? ? ? ? ? @param1 ClassLoader:類加載器沉御。用于加載代理對象字節(jié)碼的。和被代理對象使用相同的類加載器
? ??????????@param2?Class[]:字節(jié)碼數(shù)組:它是用于讓代理對象和被代理對象有相同方法
? ? ? ? ? ? @param3?InvocationHandler:用于提供增強的代碼箫爷。通常情況下都是匿名內(nèi)部類(java中匿名內(nèi)部類參數(shù)必須為final類型嚷节。局部變量的生命周期與局部內(nèi)部類的對象的生命周期的不一致性!)
7. aspectj(基于XML的AOP配置)
????????AspectJ 是一個代碼生成工具(Code Generator)
? ??????AspectJ 語法就是用來定義代碼生成規(guī)則的語法
? ? ? ? AspectJ 有自己的語法編譯工具,編譯的結(jié)果是 Java Class 文件虎锚,運行的時候硫痰,classpath 需要包含 AspectJ 的一個 jar 文件(Runtime lib)
????7.1 安裝與xml約束
? ? 7.2 AccountServiceImpl 與 Logger??
????7.3 切入點表達(dá)式
<aop:before method="beforePrintLog"
? ? ? ? // 切入點表達(dá)式: execution(表達(dá)式)
? ? ? ? //?訪問修飾符(可省略)
? ? ? ? // 返回值(*代表所有類型)?
? ? ? ? // 包名.包名.包名...類名.方法名(參數(shù)列表)(..表示當(dāng)前包及其子包)
? ? ? ? // 參數(shù)列表(..表示有無參數(shù)均可)
? ? ? ? //?全通配寫法: * *..*.*(..)
????????pointcut="execution(public void com.liuming.service.impl.AccountServiceImpl.saveAccount())"></aop:before>
????7.4 spring 通知(前置、后置窜护、環(huán)繞效斑、異常、最終)
????????aop:config標(biāo)簽表明開始AOP的配置
? ??????aop:aspect標(biāo)簽表明配置切面
? ??????動態(tài)代理的環(huán)繞通知有明確的切入點方法調(diào)用invoke()柱徙,而我們的代碼沒有缓屠。Spring框架為我們提供了一個接口:ProceedingJoinPoint。該接口有一個方法proceed()护侮,此方法就相當(dāng)于明確調(diào)用切入點方法.
8. aspectj(基于注解的AOP配置)
? ? ? ? @EnableAspectJAutoProxy 啟用aop