用过很多次切面aspect了,对于表达式总是记得很模糊,今天总结一下。
1、切面做如下设置则只会拦截返回值为String类型的方法
@Aspect public class MyInterceptor {@Pointcut("execution(java.lang.String cn.xjy.service.impl.PersonServiceBean.*(..))")private void anyMethod() {}// 声明一个切入点 @Overridepublic 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() {}// 声明一个切入点//即为这两个方法被拦截到 @Overridepublic void save(String name) {System.out.println("这是save方法");}@Overridepublic 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的方法来创建代理对象