AOP进阶-切入点表达式-execution

切入点表达式

  • 切入点表达式:描述切入点方法的一种表达式
  • 作用:主要用决定项目中的哪些方法需要加入通知
  • 常见形式:
    • execution(.....):根据方法的签名来匹配
    • @annotation(.....):根据注解匹配

execution

  • execution主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配,语法为:
    • execution(访问修饰符?   返回值  包名.类名.?方法名(方法参数)throws 异常?)
    • 其中带?的表示可以省略的部分
      • 访问修饰符:可省略(比如public、protected)
      • 包名.类名:可省略(不建议省略)
      • throws 异常:可省略(注意是方法声明抛出的异常,不是实际抛出的异常)

示例

  • com.example.tlias.service.impl.EmpServiceImpl#DeleteByID()
  • 将该类中的DeleteByID(Integer ID)位置加入到切点表达式中
  • 完整切入点表达式
    •  
      execution(public void com.example.tlias.service.impl.EmpServiceImpl.DeleteByID(java.lang.Integer))
  •  简化切入点表达式
    • execution( void DeleteByID(java.lang.Integer))

通配符

  • *:单个独立的任意符号,可以统配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分
    • execution(* void com.example.*.service.impl.EmpServiceImpl.Delete*(*))
    •  返回值任意,包名任意,方法名以Delete开头,方法参数任意一个
  • ..:多个连续的任意符号,可以通配任意层级的包,或者任意类型、任意个数的参数
    • execution(* void com.example..service.EmpService.*(..))
    •  返回任意值,EmpService包下所有方法,方法中参数个数任意个

注意

  • 根据业务需要,可以使用且(&&)、或(||)、非(!)来组合比较复杂的切入点表达式

书写建议

  • 所有的业务方法名命名时尽量规范,方便切入点表达式快速匹配 如:查询类方法都是find开头,更新类方法都是update开头
  • 描述切入点方法通常是基于接口描述,(接口可被多个类实现)而不是直接描述实现类,增强拓展性
  • 在满足业务条件需求的情况下,尽量缩小切入点的匹配范围。如:包名匹配尽量不使用..,使用*匹配单个包

你可能感兴趣的:(Java,Web学习跟踪笔记,java,开发语言)