一、切入点表达式
1、execution:匹配方法的执行
格式:execution(修饰符 返回值类型 包.类.方法(参数) throw 异常)
1.1修饰符,表示方法的修饰符,一般省略。
1.2返回类型 String表示返回String;void表示没有返回值;*表示返回任意类型,包括无返回值。
1.3包
hjp.spring.service 表示指定的包
hjp.spring.*.service 表示spring下子模块包含service的包
hjp.spring.service.. 表示service目录及其子目录
综合:hjp.spring.*.service..
1.4类 UserService表示指定的类;*Service表示以Service结尾;Test*表示以Test开头;*表示任意类名。
1.5方法(与类相似)
addUser表示指定方法;add*表示以add开头;*Do表示以Do结尾;*表示任意。
1.6参数 ()表示没有参数;(int)表示一个int类型参数;(int,int)表示两个int类型参数(如果是java.lang包下的可以省略,其他类型必须写完全限定类名);(..)表示
任意,包括无参。
1.7throws 异常,一般省略。
综合:execution(* hjp.spring.*.service..*.*(..))
2、within:匹配包或子包中的方法,如:within(hjp.spring.service..*)
3、this:匹配实现接口的代理对象中的方法,如:this(hjp.spring.dao.UserDao)
4、target:匹配实现接口的目标对象中的方法,如:target(hjp.spring.daoImpl.UserDao)
5、args:匹配参数格式符合标准的方法,如args(int,int)
6、bean:匹配指定的bean,如:bean("userServiceId")
二、AspectJ规定的通知类型
1、before:前置通知(应用:各种校验),在方法执行前执行,如果通知抛出异常,阻止方法运行。
2、afterReturning:后置通知(应用:常规数据处理),方法正常返回后执行,如果方法中抛出异常,通知无法执行;在方法执行后执行,所以才可以获得方法的返回值。
3、around:环绕通知(应用:可以做任何事),方法执行前后分别执行,可以阻止方法的执行。
4、afterThrowing:抛出异常通知(应用:包装异常信息),方法抛出异常后执行,如果方法没有抛出异常,无法执行。
5、after:最终通知(应用:清理现场),方法执行完毕后执行,无论方法是否有异常出现。
环绕通知类似代码块:
try{ //前置通知(before) //手动执行目标方法 //后置通知(after),可获得返回值 }catch{ //抛出异常通知(afterThrowing),可获得具体异常信息 }finally{ //最终(finally) }