一:基础知识
1.AOP:是一种思想,是面向切面编程,其中spring基于AOP的思想提供了一定的实现,其底层原理是动态代理:在不改动源代码的情况下,对目标对象的方法进行功能增强。基础应用:过滤器,拦截器,异常处理器以及事务等等
2.其中的专业术语:(用更简单易懂的语言)
1、连接点
类中可以被进行功能增强的方法。即 可以被AOP控制的方法
2、增强/通知
补充了原始方法没有的功能的代码。即 指哪些重复的逻辑,也就是共性功能
3、切入点
真正被增强了功能的连接点
匹配连接点的条件,通知仅会在切入点方法执行时被应用
4、切面
切入点 + 通知 结合在一起
描述通知与切入点的对应关系(通知+切入点)
5、目标对象
真正增强了功能的方法所在的对象
6、代理对象
由Spring在程序运行期间生成的对象
二:2、AOP进阶
1、通知类型
执行顺序 2,但是只能执行一个
1、环绕通知
1、是需要手动调用目标方法,且必须定义返回值的
2、环绕通知可以在方法执行的任何时刻增强功能
1、方法开始前
2、方法正常结束后
3、方法出异常
4、方法执行完了
2、前置通知
在方法开始前执行
执行顺序 1
3、后置通知
在方法执行后执行,无论方法是否正常执行,都会执行
执行顺序 3
4、返回通知
在方法正常结束后执行
5、异常通知
在方法出异常时执行
2、切面执行顺序
默认:按类名字母排序
手动指定执行顺序
@Order(执行顺序的值)
执行值,是一个正整数,值越小,优先级越高。默认值 int 的最大值
3、切点表达式
1、execution
完整语法
execution(访问修饰符? 返回值 包名.类名.方法名(方法参数) throws 异常?)
其中带 ? 的表示可以省略的部分
访问修饰符:可省略(比如: public、protected)
throws 异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常)
最终版语法
execution( 返回值 包名.类名.方法名(方法参数) )
通配符
* :单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分
.. :多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数
案例
切业务层所有的方法
execution( * com..service.impl.*.*(..) )
切控制层中所有的add方法
execution( * com..controller.*.add(..) )
切Mapper层中返回值为int类型的方法
execution( int com..mapper.*.*(..) )
切所有方法名为update,且参数为Emp的类型
execution( * ..*.update(com.itheima.pojo.Emp) )
切业务层两个int类型的方法
execution( * com..service.impl.*.*(int, int) )
切Mapper所有增删改方法
切入点没办法配符了,那就切全部,然后再通知中去通过方法信息进行过滤
使用注解
2、@annotation
1、需求
切Mapper层所有增删改方法
为Mapper层的增删改方法做增强
2、如何实现
1、自定义一个注解
MyLog
2、在Mapper层所有的增删改方法上打自定义注解MyLog
3、切点表达式指定使用哪个注解
4、连接点
1、需求
在通知中获取连接点的信息
2、只需要在通知对应的方法的第一个参数定义JoinPoint即可
通过JoinPoint就可以获取到切入点的详细信息,如类名,方法名,方法参数等等
3、图示