这是我参与「第四届青训营 」笔记创作活动的第3天
修短随化,终期于尽;情随事迁,周而复始
@TOC
前言
切面:公共的,通用的,重复的功能称为切面。 连接点:就算目标方法,因为在目标方法中要实现目标方法的功能和切面功能。 切入点(Pointcut):多个连接点构成切入点,切入点可以是一个目标方法,可以是某个包下的所有类中的所有方法 目标对象:操作谁,谁就是目标对象 通知(Advice):来指定切入的时机,是在目标方法执行前还是执行后还是出错时,还是环绕目标方法切入切面功能
一、什么是AspectJ框架?
是一个优秀的面向切面的框架,它扩展了Java语言,提供了强大的切面实现。它因为是基于Java语言,所以可做到无缝扩展 是Eclipse的开源项目 easy to learn and use(易学易用)
二、AspectJ常见通知类型
AspectJ中常用的通知有四种类型:
- 前置通知@Before
- 后置通知@AfterReturning
- 环绕通知@Around
- 最终通知@After
- 定义切入点@Pointcut
三、AspectJ的切入点表达式
规范的公式: execution(访问权限 方法返回值 方法声明(参数) 异常类型) 简化后的公式: execution( 方法返回值 方法声明(参数)) 用到的符号: “*” 代表任意个任意的字符(通配符) ”..“ 如果出现在方法的参数中,则代表任意参数。如果出现在路径中,则代表本路径及其所有的子路径
示例: execution(public * * (. .)) (公共访问权限下的,任意返回值类型的,任意路径下的任意方法的,任意参数 )即公共访问权限下的所有方法都能切入切面 execution(* set * (. .)) (任意返回值类型的,任意路径下的,以set开头的方法的,任意参数) 即任何一个以set开始的方法 execution(* com.xyz.service.impl . * . * (. .)) (任意返回值类型的,在com.xyz.service.impl包中的所有类的所有方法的,任意参数) execution(* com.xyz.service. . * . * (. .)) (任意返回值类型的,在com.xyz.service路劲下及其所有子路径的,任意类中的任意方法,任意参数) execution(* * . .service..(. .)) (任意返回值的,service前面任意多个子包(任意名称)的,service下任意类的,任意方法,任意参数) execution(* * .service..(. .) ) (任意返回值的,service之前只有一个任意名字的包的,service之后任意类中的任意方法,任意参数)
四、AspectJ的前置通知
@Before 在目标方法执行前切入切面功能,在切面方法中不可以获得目标方法的返回值,只能得到目标方法的签名 实现步骤:
- 创建业务接口
- 创建业务实现
- 创建切面类,实现切面方法
- 在applicationContext.xml文件中进行切面绑定
总结
切入点表达式 织入