type
status
date
slug
summary
tags
category
icon
password
什么是AOP
面向切面编程
我们都听说过面向对象编程,整个程序是由对象组装的。而面向切面编程,就是把一些功能实现当成一个切面,通过配置,可以把一段代码切入到程序的前面,后面,异常等。

image-20230216140254184
可以在切面类里面写很多方法,切面类的方法可以根据需要插入到指定的地方。
快速入门
- 引入包aspectj
- 通知方法
- 前置通知:@Before
- 对应上一节代码中的方法执行前的通知。
- 返回通知:@AfterReturning
- 对应执行完业务代码之后执行的代码
- 异常通知:@AfterThrowing
- 发生异常时执行的代码
- 后置通知:@After
- 对应插入finally代码块中的方法
- 环绕通知:@Around
- 相当于统一管理。
需求说明
使用aop编程的方式,重构上一节使用动态代理的方式写的代码
切面类
- 现在使用aspectj包来使用,那么对象都交给spring来管理。
- 使用@aspect注解,代替了之前的 VehicleAnimalProvider类。
- @Before代表是一个前置通知。
- value,exection代表插入的是哪个方法,带上方法全路径和参数类型可以唯一确定一个方法。
- JoinPoint,在底层执行的时候,会给插入的方法封装成JoinPoint,可以获取到方法名,参数等信息。
代码
扫描包注入对象
测试
通过接口的方式注入对象,输出类型为代理对象,这就和之前的类似了,先获取代理对象,通过代理对象执行方法,代理对象会把,代理对象会把对应的方法切入进去。

image-20230216151539056
而直接获取对象会失败
因为如果使用了aop,底层是动态代理,那么就不能直接获取对象执行方法,因为这样就绕过了代理对象,aop的功能就体现不出来了。

image-20230216151651267
其他方法切入到其他位置
结果

image-20230216162539929
SpringAOP注意事项
切入多个方法
模糊配置,可以覆盖到其他方法

image-20230216162250258
开启aop注解功能
如果把
<aop:aspectj-autoproxy/>
配置去掉,那么aop功能就会失效
image-20230216162515961
需要以接口的类型来获取对象,因为需要使用动态代理的方式实现切面编程,所以不能直接获取对象执行方法。
但如果这个类就是单独的,没有实现接口,就不能使用aop了吗
额,目前看来是的。