淺析Spring基于注解的AOP
一、準備工作
①創(chuàng)建一個Maven工程
②添加依賴
在IOC所需依賴基礎上再加入下面依賴即可:
<!-- spring-aspects會幫我們傳遞過來aspectjweaver --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.1</version> </dependency>
③把上節(jié)的接口和實現(xiàn)類復制過來,因為我們要在這個環(huán)境里面測試
二、基于注解的AOP之前置通知
如果我們要實現(xiàn)AOP的話,它也是要在我們的IOC的基礎上實現(xiàn)的,所以說我們必須要把切面還有目標對象交給IOC容器來管理
AOP 抽橫切關注點(非核心業(yè)務代碼)
①創(chuàng)建切面類并配置
/**
* 在切面中,需要通過指定的注解將方法標識為通知方法
* @Before:前置通知,在目標對象方法執(zhí)行之前執(zhí)行
*/
@Component
@Aspect //將當前組件標識為切面
public class LoggerAspect {
@Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
public void beforeAdviceMethod() {
System.out.println("LoggerAspect,前置通知");
}
}②創(chuàng)建Spring配置文件,讓ioc對我們的目標對象進行管理
<!--
AOP的注意事項:
切面類和目標類都需要交給IOC容器管理
切面類必須通過@Aspect注解標識為一個切面
在Spring的配置文件中設置<aop:aspectj-autoproxy />開啟基于注解的AOP
-->
<context:component-scan base-package="com.tian.spring.aop.annotation"></context:component-scan>
<!--開啟基于注解的AOP-->
<aop:aspectj-autoproxy/>測試類:
public class AOPTest {
@Test
public void testAOPByAnnotation() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
Calculator calculator = ioc.getBean(Calculator.class);
calculator.add(1,2);
}
}三、基于注解的AOP之切入點表達式的語法和重用以及獲取連接點的信息
1.在切面中,需要通過指定的注解將方法標識為通知方法
@Before:前置通知,在目標對象方法執(zhí)行之前執(zhí)行
2.切入點表達式:設置在標識通知的value屬性中
execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))
execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))
第一個*表示任意的訪問修飾符和返回值類型
第二個*表示類中任意的方法
..表示任意的參數(shù)列表
類的地方也可以使用*,表示包下所有的類
①切入點表達式的語法
上述已經(jīng)將我們的前置通知,通過切入點表達式作用到了我們的連接點上,下面我們來說是細節(jié)問題,因為我們設置得還不是很完美,就比如上面實現(xiàn)了后只能作用與我們的add方法,因為我們的切入點表達式是寫死了的,下面我就來進行更完美的代碼實現(xiàn)
將切面類中的切入點表達式修改為如下
/**
*
* 切入點表達式:設置在標識通知的value屬性中
* execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))
* execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))
* 第一個*表示任意的訪問修飾符和返回值類型
* 第二個*表示類中任意的方法
* ..表示任意的參數(shù)列表
* 類的地方也可以使用*,表示包下所有的類
*/
@Component
@Aspect //將當前組件標識為切面
public class LoggerAspect {
// @Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
@Before("execution(* com.tian.spring.aop.annotation.*.*(..))")
public void beforeAdviceMethod() {
System.out.println("LoggerAspect,前置通知");
}
}測試類:
public class AOPTest {
@Test
public void testAOPByAnnotation() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
Calculator calculator = ioc.getBean(Calculator.class);
calculator.sub(1,2);
}
}②獲取連接點的信息
獲取連接點的信息
在通知方法的參數(shù)位置,設置JoinPoint類型的參數(shù),就可以獲取連接點所對應方法的信息 獲取連接點所對應方法的簽名信息
Signature signature = joinPoint.getSignature();
獲取連接點所對應方法的參數(shù)
Object[] args = joinPoint.getArgs();
System.out.println("LoggerAspect,方法:" + signature.getName() + ",參數(shù)" + Arrays.toString(args));
我們在之前的動態(tài)代理里面,我們在前置通知的位置,也就是在我們目標對象的方法執(zhí)行之前,然后我們在方法體中輸出的是我們要調(diào)用的方法的方法名,還有就是我們當前的參數(shù)列表,但是我們用了前置通知之后,我們不知道如何獲取了,還沒有我們動態(tài)代理實現(xiàn)的功能多。而且連接點的信息我們都獲取不到,也就是我當前要加入通知的方法,它的一些信息我們都獲取不到。其實我們也是可以獲取到的,下面我就來實現(xiàn)
// @Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
// @Before("execution(* com.tian.spring.aop.annotation.*.*(..))")
@Pointcut("pointCut()")
public void beforeAdviceMethod(JoinPoint joinPoint) {
//獲取連接點所對應方法的簽名信息
Signature signature = joinPoint.getSignature();
//獲取連接點所對應方法的參數(shù)
Object[] args = joinPoint.getArgs();
System.out.println("LoggerAspect,方法:" + signature.getName() + ",參數(shù)" + Arrays.toString(args));
}③重用寫入點表達式
重用切入點表達式
//@Pointcut聲明一個公共的切入點表達式
@Pointcut("execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))") public void pointCut() {}
使用方式:@Pointcut("pointCut()")
聲明
@Pointcut("execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))")
public void pointCut() {
}引用
@After("pointCut()")
public void afterAdviceMethod() {
}
到此這篇關于淺析Spring基于注解的AOP的文章就介紹到這了,更多相關Spring AOP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot項目連接多種數(shù)據(jù)庫該如何操作詳析
在Spring Boot應用中連接多個數(shù)據(jù)庫或數(shù)據(jù)源可以使用多種方式,下面這篇文章主要給大家介紹了關于springboot項目連接多種數(shù)據(jù)庫該如何操作的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-08-08
Spring Cloud gateway 網(wǎng)關如何攔截Post請求日志
這篇文章主要介紹了Spring Cloud gateway 網(wǎng)關如何攔截Post請求日志的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
vue3使用vue-diff工具來比較數(shù)據(jù)差異
這篇文章主要為大家詳細介紹了vue3如何使用vue-diff工具來比較數(shù)據(jù)差異,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-11-11
Java原生服務器接收上傳文件 不使用MultipartFile類
這篇文章主要為大家詳細介紹了Java原生服務器接收上傳文件,不使用MultipartFile類,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09
聊聊在獲取方法參數(shù)名方面,Spring真的就比Mybatis強?
在獲取方法參數(shù)名方面,Spring真的就比Mybatis強嗎?今天就帶大家聊聊這個話題,如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java異步編程之Callbacks與Futures模型詳解
這篇文章主要為大家詳細介紹了Java異步編程中Callbacks與Futures模型的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-03-03

