SpringBoot框架aop切面的execution表達式解讀
SpringBoot aop切面execution表達式
Aspectj切入點語法定義在使用spring框架配置AOP的時候,不管是通過XML配置文件還是注解的方式都需要定pointcut"切入點"
例如:
定義切入點表達式 execution (* com.nandao.demo.controller.*.*.*(..))
/**
* 監(jiān)控controller層的接口
*/
@Pointcut("execution(* com.nandao.demo.controller.*.*.*(..))")
private void pointCut(){}execution()是最常用的切點函數(shù),其語法如下所示:
整個表達式可以分為五個部分
1、execution(): 表達式主體,可以掃描控制層的接口、某個注解、或者其他需要掃描的類。
2、第一個*號:表示返回類型,*號表示所有的類型,比如public,protect,private等。
3、包名:表示需要攔截的包名,后面的兩個句點表示當前包和當前包的所有子包,com.demo.service.impl包、子孫包下所有類的方法。
4、第二個*號:表示子包名,*號表示所有子包。
5、第三個*號:表示類名,*號表示所有子包下的類。
6、*(..):最后這個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數(shù),兩個句點表示任何參數(shù)。
springboot aop自定義切面編程
本文結(jié)合springboot,實現(xiàn)切面編程。
- @Before 前置通知:在某連接點(JoinPoint)之前執(zhí)行的通知, 但這個通知不能阻止連接點前的執(zhí)行。
- @After 后通知:當某連接點退出的時候執(zhí)行的通知 (不論是正常返回還是異常退出)。
- @AfterReturning 返回后通知 :在某連接點正常完成后執(zhí)行的通知, 不包括拋出異常的情況。
- @Around 環(huán)繞通知 :包圍一個連接點的通知,類似Web中Servlet ,規(guī)范中的Filter的doFilter方法??梢栽诜椒ǖ恼{(diào)用前后完成 自定義的行為,也可以選擇不執(zhí)行。
- @AfterThrowing 拋出異常后通知:在方法拋出異常退出時執(zhí)行的通知。
1.首先pom文件引入aop依賴
<!-- spring-boot的aop切面服務 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>2.新建兩個類
- 一個實現(xiàn)切面的處理類
- 一個定義注解
首先是定義注解:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestAnnotation {
}然后是:切面處理類
@Order(2)
@Aspect //定義一個切面
@Configuration
public class TestAspect {
// 定義切點Pointcut
//第一個注解:表示掃描的包或類, 第一個*可以寫具體的類,第二個*是方法,括號里是傳參
//第二個注解表示定義的注解, 哪個方法需要切面,就在方法上加上 @TestAnnotation
@Pointcut("execution(public * com.example.demo.controller.*.*(..)) && @annotation(com.example.demo.aop.annotation.TestAnnotation)")
public void executeService() {
}
//執(zhí)行方法之前,進入切面
@Before(value = "executeService()")
public void doBeforeAdvice(JoinPoint joinPoint) {
}
//在進去方法的同時,進入切面
@Around("executeService()")
public Object doAroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletResponse response = sra.getResponse();
HttpServletRequest request = sra.getRequest();
String uri = request.getRequestURI();
Object result = pjp.proceed();
return result;
}
//在執(zhí)行完方法后,進入切面,并返回方法的結(jié)果值,returning定義的參數(shù)必須和Object后的形參一致
@AfterReturning(value = "executeService()", returning = "result")
public void doAfterAdvice(JoinPoint joinPoint, Object result) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletResponse response = sra.getResponse();
if (response.getStatus() == 200) {
HttpServletRequest request = sra.getRequest();
String uri = request.getRequestURI();
HttpSession session = request.getSession(true);
Gson gson = new Gson();
JSONObject jsonObject = JSON.parseObject(gson.toJson(result));
}
}
}具體方法 的注解已經(jīng)放到代碼中,
Gson 的pom依賴:
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>注意:
假如定義了一個切面: 即一個方法只被一個aspect類攔截,aspect類內(nèi)部的 advice 將按照以下的順序進行執(zhí)行:

若同一個方法被多個Aspect類攔截,執(zhí)行順序是不一定的。
想要有一定的順序,可以在處理類中加入@Order 注解;
執(zhí)行順序如下:

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談SpringCloud?Alibaba和SpringCloud的區(qū)別
這篇文章主要介紹了淺談SpringCloud?Alibaba和SpringCloud的區(qū)別,Spring?Cloud?Netflix框架也屬于Spring?Cloud,但是Netflix并不是由spring來進行開發(fā)的,需要的朋友可以參考下2023-05-05
spring?boot項目自定義參數(shù)校驗規(guī)則示例詳解
這篇文章主要介紹了spring boot項目如何自定義參數(shù)校驗規(guī)則,自定義校驗規(guī)則和自帶的規(guī)則實現(xiàn)方式一樣,先自定義一個注解,然后指定校驗類,在校驗類里實現(xiàn)具體的校驗規(guī)則,本文結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-07-07
深入解析JVM之內(nèi)存結(jié)構(gòu)及字符串常量池(推薦)
Java作為一種平臺無關(guān)性的語言,其主要依靠于Java虛擬機——JVM,接下來通過本文給大家介紹JVM之內(nèi)存結(jié)構(gòu)及字符串常量池的相關(guān)知識,需要的朋友可以參考下2020-07-07
java編程調(diào)用存儲過程中得到新增記錄id號的實現(xiàn)方法
這篇文章主要介紹了java編程調(diào)用存儲過程中得到新增記錄id號的實現(xiàn)方法,涉及Java數(shù)據(jù)庫操作中存儲過程的相關(guān)使用技巧,需要的朋友可以參考下2015-10-10

