spring註解詳解與用法(3)切面環繞

導航:更多的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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章