導航:更多的spring註解標籤點擊這裏
聲明瞭切面類我們還需要定義切面的內容面向切面編程是spring的一個重要思想,也是精華之一
@Aspect
這是一個切面的註解,聲明是一個額外的面向切面的功能
用法示例:
@Aspect
public class AspectTest { }
當然,別忘了添加maven依賴
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
聲明瞭切面類,我們還需要有具體的切面內容,springs提供了3個註解,如下所示
@After//後置建言(advice),在原方法前執行。
@Before//前置建言(advice),在原方法後執行。
@Around//環繞建言(advice),在原方法執行前執行,在原方法執行後再執行(@Around可以實現其他兩種advice)
@Pointcut//即定義攔截規則,確定有哪些方法會被切入
使用示例
@Aspect
@Component
public class AspectTest {
@Before("d()")
public void a(JoinPoint joinPoint){
System.out.println("前置");
}
@After("d()")
public void b(JoinPoint joinPoint){
System.out.println("後置");
}
@Around("d()")
public Object c(ProceedingJoinPoint pjp)throws Throwable{
System.out.println("環繞1");
Object obj=pjp.proceed();
System.out.println("環繞2");
return obj;
}
@Pointcut("@annotation(org.yly.minbox.boot.Test.Log)")//切入點,這裏採用添加了註解來切入
public void d(){}
}
@RestController
public class Web {
@RequestMapping("a123")
@Log
public String aaa(String a){
System.out.println("執行的方法體");
return "111111";
}
}
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
}
效果示例:
@AfterThrowing//異常環繞
AfterThrowing是一個增強環繞,當出現異常的時候走次方法,
使用示例
@AfterThrowing(throwing="ex",pointcut="d()")
public void AfterThrowing(Throwable ex){
System.out.println("出現異常"+ex.getMessage());
}
我們可以修改一下剛纔那個接口,增加一個異常
執行效果
@AfterReturning//異常環繞
AfterReturning也是後置環繞,但是他和@After不一樣的是可以獲取主方法體的返回值
使用示例:
@AfterReturning(returning="returnValue",pointcut="d()")
public void AfterRun(JoinPoint joinPoint,Object returnValue){
System.out.println("有返回值的後置環繞="+returnValue);
}
效果:
@Order//排序
環繞排序,當一個方法同時滿足多個同等環繞設置時優先走哪個方法
示例
注意(1)
啓動環繞功能需要告訴spring,如果是mvc,xml配置如下
<aop:aspectj-autoproxy proxy-target-class="true"/>
如果是boot,需要在啓動文件加上@EnableAspectJAutoProxy,如下圖所示
注意(2)
Around環繞與其他的不同,前置環繞與後置環繞都是走完自動走下一步,但是Around他需要我們手動執行下一步,通過調用參數ProceedingJoinPoint 的proceed方法,否則會跳過方法體,如下所示
如果不調用proceed方法會導致前置環繞與方法體本身都無法執行
proceed方法用來區分方法執行前後環繞,proceed調用前的代碼爲方法執行前置環繞,proceed後的代碼爲後置環繞
After,Before,Around,AfterReturning的順序
Around→Before→方法體→Around→After→AfterReturning