AOP简介
- 面向切面编程(Aspect Oriented Programming),从不同的维度或角度给已有程序添加附加功能的一种技术
- 实现的方式是Spring容器为程序创建代理,让调用方无感知的调用指定方法,在运行期间动态的“织入”其他逻辑
- 主要目的是为了解耦
- 弥补OOP中只能继承类或实现接口进行功能扩充的不足
- 让应用逻辑更加清晰,业务逻辑只关注业务本身
- 可以获取拦截方法请求的参数和返回,但不能获取HTTP信息
- 主要应用场景:声明式事务、服务权限过滤、缓存、全局日志和一些框架的持久化
AOP主要注解
- @Aspect:定义一个切面,一般作用于类上
- @Pointcut(value=“表达式标签”):定义切入点,可以指定相应的包、类、注解做为切入点,有12种表达式标签,常用的为execution(表达式),表达式又支持很多种格式
- @Before:切入点方法执行前调用
- @After:切入点方法执行后调用
- @AfterReturning:切入点方法正常执行并成功返回后调用
- @AfterThrowing:切入点方法产生并抛出异常后调用
- @Around:切入点方法环绕处理,完全控制方法是否执行,能在方法执行前、执行后添加相应的逻辑,可以理解为包含上述所有逻辑
AOP常用表达式标签
- execution:匹配方法执行的连接点
- within:匹配指定类型内的方法执行
- this:匹配当前AOP代理对象类型的执行方法
- target:匹配当前目标对象类型的执行方法
- args:匹配当前执行的方法传入的参数为指定类型的执行方法
- @within:匹配所以持有指定注解类型内的方法
- @target:匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解
- @args:匹配当前执行的方法传入的参数持有指定注解的执行
- @annotation:匹配当前执行方法持有指定注解的方法
- bean:Spring AOP扩展的,匹配特定名称的Bean对象的执行方法
了解即可,不需要记住,有业务需要的时候,再去看详细的内容
execution表达式
-
execution包含的表达式,支持各种格式,了解常用的就好,使用时根据业务需要再去学习相应的匹配模式
常用的匹配通配符有
*:匹配任何数量字符
..:匹配任何数量的子包,或方法中的任意多个参数
+:匹配指定类型及子类型
execution匹配示例
public .(..):匹配任意公共方法 -
com.lemon.demo.UserService.*():匹配com.lemon.demo.UserSerivce下的所有无参方法,返回值类型任意
-
com.lemon.demo.springboot3.service.UserService.getById(..):匹配userService.getById方法,传入参数任意,返回值任意
AOP使用方式
1、引入依赖:在pom.xml中添加对spring-boot-starter-aop的依赖
2、定义切面:定义一个类,使用@Aspect注解修饰,并注意加上@Component注解
3、定义切入点:在类中添加一个方法,使用@Pointcut注解修饰成切入点
4、拦截逻辑:在类中添加一个方法,使用@Around(“切入点注解的方法名”)注解修改成环绕拦截
AOP示例
见附件中aop包中的两个分别基于getById的方法拦截、基于@Log注解拦截处理,通过控制台查看拦截效果
附件:useraop.zip
欢迎来到testingpai.com!
注册 关于