spring5框架中AOP中使用AspectJ註解
阿新 • • 發佈:2021-01-27
技術標籤:spring5springspringjavaaop後端
AspectJ5版本支援了基於註解的開發方式,當然其仍然需要AspectJ自己的編譯器。
要使用基於註解的開發方式,需要為專案引入aspectjweaver.jar包,該Jar包也在AspectJ安裝目錄下的lib目錄中。aspectjweaver.jar中包含了aspectjrt.jar包中的內容,所以只需要引入aspectjweaver.jar包即可。
1、建立類,在類裡面定義方法
public class User {
public void add() {
System.out.println ("add. ");
}
}
2、建立增強類(編寫增強邏輯)
- 在增強類裡面,建立方法,讓不同方法代表不同通知型別
//增強的類
public class UserProxy {
public void before() {//前置通知
System.out.println("before. ");
}
}
3、進行通知的配置
- (1) 在 spring 配置檔案中,開啟註解掃描
<?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/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 開啟註解掃描 >
<context:component-scan base- package="com.atguigu.spring5.aopanno"></context:component-scan>
- (2) 使用註解建立 User 和 UserProxy 物件
- (3) 在增強類上面添加註解 @Aspect
//增強的類
@Component
@Aspect //生成代理物件
public class UserProxy {
)
- (4) 在 spring 配置檔案中開啟生成代理物件
<!-- 開啟 Aspect 生成代理物件-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
4、配置不同型別的通知
//增強的類
@Component
@Aspect //生成代理物件public class UserProxy {
//前置通知
//@Before 註解表示作為前置通知
@Before(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void before() {
System.out.println("before. ");
}
//後置通知(返回通知)
@AfterReturning(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void afterReturning() {
System.out.println("afterReturning ");
}
//最終通知
@After(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void after() {
System.out.println("after. ");
}
//異常通知
@AfterThrowing(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void afterThrowing() {
System.out.println("afterThrowing. ");
}
//環繞通知
@Around(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("環繞之前 ");
//被增強的方法執行
proceedingJoinPoint.proceed();
System.out.println("環繞之後 ");
}
}
5、相同的切入點抽取
@Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void pointdemo() {
}
//前置通知
//@Before 註解表示作為前置通知@Before(value = "pointdemo()") public void before() {
System.out.println("before. ");
}
6、有多個增強類多同一個方法進行增強,設定增強類優先順序
在增強類上面添加註解 @Order(數字型別值),數字型別值越小優先順序越高
@Component
@Aspect
@Order(1)
public class PersonProxy
6、完全註解開發
建立配置類,不需要建立 xml 配置檔案
@Configuration
@ComponentScan(basePackages = {"com.atguigu"}) @EnableAspectJAutoProxy(proxyTargetClass = true)
public class ConfigAop {
}