用过很多次切面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的方法来创建代理对象