Spring中Aspect的切入點的表達式定義細節


用過很多次切面aspect了,對於表達式總是記得很模糊,今天總結一下。

1、切面做如下設置則只會攔截返回值為String類型的方法

 
        
@Aspect
public class MyInterceptor {
   
    @Pointcut("execution(java.lang.String cn.xjy.service.impl.PersonServiceBean.*(..))")
    private void anyMethod() {
    }// 聲明一個切入點

    @Override
    public String getPersonName(Integer id) {
        System.out.println("這是getPersonName方法");
        return "yyy";
    }

}//即只會攔截這個方法

2、做如下配置則只會攔截,傳入參數值第一個為String類型的方法(不管后面有沒有其他方法)

@Aspect
public class MyInterceptor {
    @Pointcut("execution(* cn.xjy.service.impl.PersonServiceBean.*(java.lang.String,..))")
    private void anyMethod() {
    }// 聲明一個切入點

    //即為這兩個方法被攔截到
    @Override
    public void save(String name) {
        System.out.println("這是save方法");
    }

    @Override
    public void update(String name,Integer id ) {
        System.out.println("這是update方法");
    }
}

 

 
        
3、做如下配置則會攔截到所有返回值類型為非void的方法

@Aspect
public class MyInterceptor {

    @Pointcut("execution(!void cn.xjy.service.impl.PersonServiceBean.*(..))")
    private void anyMethod() {
    }// 聲明一個切入點
    
}
 
        

 

4、以下配置代表Spring框架會攔截cn.xjy.service包以及其子包下的所有類的所有方法

@Aspect
public class MyInterceptor {
    @Pointcut("execution(* cn.xjy.service..*.*(..))")
    private void anyMethod() {
    }// 聲明一個切入點
    
}

Spring框架會為滿足cn.xjy.service..*底下所有的類創建代理對象 ;
創建代理對象:里面的類實現了接口–使用JDK創建動態代理技術來創建,若沒有實現接口:采用CGlib的方法來創建代理對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM