SpringAOE的程式碼實現(未完工)
AOE簡介
1、aop的概述
aop:面向切面程式設計
程式導向語言:C等
面嚮物件語言OOP:java等
面向切面程式設計AOP:在不修改原始碼的情況下 對目標方法進行增強 (方法解耦和)
面向服務架構SOA:圍繞是系統的開發進行專案拆分
AOP優點:程式碼重用性提高 降低程式碼的耦合性 在不修改原始碼的情況下 對目標方法進行增強
2、aop的底層實現–動態代理
JDK的基於介面的動態代理
CGlib基於父類的動態代理
相關實現程式碼見上一篇文章:動態代理
3、aop相關的術語
目標物件:target
代理物件:proxy
連線點:joinPoint 可能被增強的方法
切(入)點:pointCut 真正被增強的方法(配置切點表示式:告知spring哪些方法被增強)
通知:Advice 增強方法
切面:Aspect =切點+通知
織入:Weaving 是個動詞,代表是切點與通知的結合過程叫做織入(織入的配置是AOE的重點)
引介:動態在代理物件中 生成新的欄位 方法 ….
xml配置方式
1、除了核心包外還需要匯入aop相關的jar包
spring-aop-4.2.4.RELEASE.jar包
spring-aspects-4.2.4.RELEASE.jar包
com.springsource.org.aopalliance-1.0.0.jar包 —aop聯盟
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar包
aspectj的織入的包
2.建立介面和目標類
介面
package com.cuixiaoming.aop.xml;
public interface TargetInterface {
void targetMethod();
}
目標類
package com.cuixiaoming.aop.xml;
public class Target implements TargetInterface {
@Override
public void targetMethod() {
System.out.println("目標方法開始執行");
//int a= 1/0;//用於測試異常丟擲
System.out.println("目標方法執行完畢");
}
}
3、建立切面類(包含通知)
PS:切面=切點+通知 建立切面是不完整 缺少切點 通過織入將切點與增強在切面內部結合
建立MyAspect
通知的分類見下面xml配置
這裡的方法名可以隨意配置
package com.cuixiaoming.aop.xml;
import org.aspectj.lang.ProceedingJoinPoint;
//切面物件
public class MyAspect {
public void before(){
System.out.println("before:前置增強");
}
public void afterReturning(){
System.out.println("afterReturning:後置增強");
}
//使用環繞的時候需要執行切入點方法
public void around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("around:前置增強");
pjp.proceed();//執行切點方法
System.out.println("around:後置增強");
}
//目標方法出現異常,報錯之前執行該方法
public void afterThrowing(){
System.out.println("afterThrowing:丟擲異常增強");
}
//最終的意思是,就算報錯也會執行,但是並不一定最終執行
public void after(){
System.out.println("after:最終增強");
}
}
我們在XML進行配置
匯入約束頭
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
將目標物件和切面物件進行配置
<!--目標物件-->
<bean id="target" class="com.cuixiaoming.aop.xml.Target"></bean>
<!--通知類-->
<bean id="myAspect" class="com.cuixiaoming.aop.xml.MyAspect"></bean>
下面對織入過程進行配置
<aop:config>
<!--在哪一個類裡面裝了通知方法-->
<aop:aspect ref="myAspect">
<!-- 在這裡配置通知方法 -->
</aop:config>
- 通知的分類 (以在xml中標籤的名字區分,在建立通知方法的時候,可以隨意起名字,在xml中進行配置就可以了)
- aop:before:前置增強
- aop:after-returning:後置增強
- aop:around:環繞增強 (前置+後置)
- 這個需要注意一下,需要在前後置程式碼之間執行目標方法—>pjp.proceed();
- aop:after-throwing:異常丟擲增強
- 在目標方法報錯的時候,在錯誤資訊之前執行
- aop:after:最終增強
- 最終增強的意思不是最後執行,而是總會執行,就算報錯也會執行的增強,他的執行順序不確定
下面以before為例子
<aop:before method="before" pointcut="execution(public void com.cuixiaoming.aop.xml.Target.targetMethod())"></aop:before>
這是一種基本的寫法.pointcut裡面裝的是切點表示式
切點表示式
pointcut="execution(public void com.itheima.aop.xml.Target.targetMethod())"
語法:
pointcut="execution([訪問修飾符] 返回值 包.類.方法(引數列表))"
切點表示式用來定義哪些連線點是切點
注意:
1. 訪問修飾符可以省略
2. 返回值、包、類、方法 可以使用 * 代表任意
3. 引數列表可以使用 .. 代表任意
常用的配置:
void com.itheima.aop.xml.Target.targetMethod()
* com.itheima.aop.xml.Target.*() //指定類中任意無參方法
* com.itheima.aop.xml.Target.*(..) //指定類中任意方法
* com.itheima.aop.xml.*.*(..) //指定包中任意類中任意方法(常用)
* com.itheima.aop.xml..*.*(..) //指定包中
相關文章
- 「gRPC」 Gateway的實現程式碼RPCGateway
- Tomcat程式碼實現Tomcat
- Promise 程式碼實現Promise
- 未完工000
- OutputStreamWriter介紹&程式碼實現和InputStreamReader介紹&程式碼實現
- Locust 程式碼指令碼實現指令碼
- Linklist程式碼實現以及程式碼解讀
- 如何實現程式碼高亮
- HashTable實現程式碼分享
- 實現【檢視更多】功能的程式碼
- Jquery實現的高亮效果程式碼分享jQuery
- 實現簡單的`Blazor`低程式碼Blazor
- 雜湊表的程式碼實現(Java)Java
- 微信小程式開發完工+問題彙總微信小程式
- 180行JavaScript程式碼實現的小球隨機移動程式碼JavaScript隨機
- AES和DES程式碼實現
- Python課程程式碼實現Python
- DES原理及程式碼實現
- vysor原理與程式碼實現
- js 實現程式碼雨效果JS
- verilog 中實現 sram 程式碼
- JavaScript中的繼承及實現程式碼JavaScript繼承
- golang 中,對稱加密的程式碼實現Golang加密
- PHP獲取MAC地址的實現程式碼PHPMac
- UITableView的原理——探究及重新實現程式碼UIView
- 執行緒池的實現程式碼分析執行緒
- 存貨未實現
- 低程式碼/無程式碼的SaaS/CRM還有未來嗎?
- 2021低程式碼現狀:回顧過去,展望未來
- 《整潔程式碼cleancode》的javascript原始碼實現專案JavaScript原始碼
- Java 實現的SnowFlake生成UUID (Java程式碼實戰-007)JavaUI
- 使用GitHub的Webhooks實現程式碼的自動部署GithubWebHook
- 程式碼實現中卡了很久的問題
- Netty實現的一個非同步Socket程式碼Netty非同步
- 用程式碼探討KVC/KVO的實現原理
- Mybatis自動程式碼生成器的實現MyBatis
- 300行Kotlin程式碼實現的區塊鏈Kotlin區塊鏈
- Mybatis-plus程式碼生成器的實現MyBatis