在面向切面编程中(AOP),往往最先要做的事是配置切入点,官方文档中的切入点表达式如下所示:
语法:指示符(访问修饰符(可选) 返回值类型(必须) 包名类名(可选) 方法(必须) 参数)
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
例如execution (public * com.ljb.service.impl..*.*(..))
- execution:指示符,execution是最常用的指示符,用于匹配方法执行的连接点。
- public:访问修饰符,该参数可选。
- 第一个*号:返回值类型,*号表示所有的类型,即通配符。
- 包名:需要拦截的包名,后面的两个点表示当前包和当前包的所有子包,即例子中的com. ljb.service.impl包和该包的子孙包下所有类。
- 第二个*号:类名,*号表示所有的类。
- *(..):方法名,*号表示所有方法,括号里面表示方法的参数,两个点表示任何参数,可有可无。
1. 拦截BookServiceImpl类中的select ()方法
execution(public * com.ljb.service.impl.BookServiceImpl.select())
2. 该表达式同上,只是省略了public修饰符
execution(* com.ljb.service.impl.BookServiceImpl.select ())
3. 包名与类名都用*号,视具体路径来判断使用的*号个数,此处路径同上,故而有五个*
execution(* *.*.*.*.*.select())
4. 拦截指定包及其子包下的BookServiceImpl类的所有select方法
execution(* com..BookServiceImpl.select())
5. 拦截所有BookServiceImpl结尾的类的所有无参方法(此处*号匹配所有方法)
execution(* com..*BookServiceImpl.*())
6. 拦截所有BookServiceImpl结尾的类的所有带任意参数方法
execution(* com..*BookServiceImpl.*(..)) 参数任意,可有可无
execution(* com..*BookServiceImpl.*(*)) 参数个数任意,必须有
7. 拦截所有select开头的带任意参数方法
execution(* select*(..))
8. 拦截所有select开头或者add开头的方法(||、or)
expression="execution(* select*(..)) || execution(* add*(..))
expression="execution(* select*(..)) or execution(* add*(..))
9. 拦截容器中指定的bean
拦截容器中BookService类中的所有方法
expression="bean(BookService)"
拦截容器中Service结尾的类中的所有方法
expression="bean(*Service)"
10. 不拦截select开头的方法(!、not)
expression="!execution(* select*(..))"
expression=" not execution(* select*(..))