spring應用手冊-AOP(註解)-(20)-切面釋出-前置通知

q2780004063發表於2020-10-18

戴著假髮的程式設計師出品 抖音ID:戴著假髮的程式設計師 歡迎關注

切面釋出-前置通知

spring應用手冊(第三部分)


前置通知的意思是在目標方法執行之前執行增強程式。前面的例子我們也寫過潛質通知。

注意,前置通知僅僅就是前置增強,前置通知並不能改變目標方法的執行。更不能阻止目標方法的執行。

現在我們來仔細分析以下前置通知的案例:

我們準備一個業務類InfoService,其中有一個方法為showInfo(String info).

/**
 * @author 戴著假髮的程式設計師
 * 
 * @description
 */
@Component
public class InfoService {
    public void showInfo(String info){
        System.out.println("InfoService-showInfo輸出資訊:"+info);
    }
}

新增一個Aspect類,在其中新增一個前置通知:

/**
 * @author 戴著假髮的程式設計師
 * 
 * @description
 */
@Component //將當前bean交給spring管理
@Aspect //定義為一個AspectBean
public class DkAspect {

    @Pointcut("execution(* com.st.service..*.*(..))")
    public void pointcut1(){}

    @Before("pointcut1()")
    public void before(){
        System.out.println("--這裡是前置通知--");
    }
}

主配置類:

/**
 * @author 戴著假髮的程式設計師
 * 
 * @description
 */
@Configuration
@ComponentScan("com.st")
@EnableAspectJAutoProxy
public class Appconfig {
}

測試:

@Test
public void testBefore(){
    ApplicationContext ac =
            new AnnotationConfigApplicationContext(AppConfig.class);
    InfoService bean = ac.getBean(InfoService.class);
    bean.showInfo("今天天氣不錯");
}

結果:
在這裡插入圖片描述
這裡前置通知已經生效。

接下來我們來看看前置通知的方法中可以傳遞的引數。

首先就是可以傳遞一個JoinPoint類,這個類在前面已經解釋過,除此之外,我們還可以傳遞我們攔截的方法的引數。

看下面案例:

我們修改Aspect類

/**
 * @author 戴著假髮的程式設計師
 * 
 * @description
 */
@Component
@Aspect
public class DkAspect {
    @Pointcut("execution(* com.st.dk.demo8.service..*.*(..))")
    public void pointcut1(){}

    /**
     * 這裡注意
     * 我們可以傳入JoinPoint不用解釋
     * 如果我們希望傳入其他引數,則需要使用args指定,
     * 這裡的args(info)中的info必須和引數info一致。
     * 而且要和被攔截的方法中的引數名也一致。
     */
    @Before("pointcut1() && args(info)")
    public void before(JoinPoint joinPoint,String info){
        System.out.println("--這裡是前置通知開始--");
        System.out.println("目標物件:"+joinPoint.getTarget());
        System.out.println("代理物件:"+joinPoint.getThis());
        System.out.println("增強的方法的引數列表:"+ Arrays.toString(joinPoint.getArgs()));
        System.out.println("我們手動傳入的引數info:"+info);
        System.out.println("--這裡是前置通知結束s--");
    }
}

再測試:
在這裡插入圖片描述
這裡我們再次提醒一個配置,我們可以通過JoinPoint獲取被攔截方法的引數列表陣列,但是如果我們希望某個指定的引數直接傳遞到我們的增強方法中時,我們需要使用args(引數名)匹配有指定引數的方法,所有的相關引數名必須相同。

如果還不明白請參看視訊講解。

相關文章