用過很多次切面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的方法來創建代理對象