AOP:Aspect Oriented Programming(面向切面编程)。通过不修改源代码的方式,在主干里面添加新功能。
AOP底层用的是动态代理:
(1)有接口,使用JDK动态代理
需要创建接口实现类代理对象
(2)没有接口,使用CGLIB动态代理
创建当前类的子类的代理对象
AOP中专业的术语:
1. 连接点
类里面的哪些方法可以被增强,这些方法称为连接点。
2. 切入点
实际真正被增强的方法,称为切入点。
3. 通知(增强)
实际增强的逻辑部分,称为通知。
- 前置通知
- 后置通知
- 环绕通知
- 异常通知
- 返回通知
执行顺序为:环绕通知(前),前置通知,切入点方法,返回通知,后置通知,环绕通知(后)
如果有异常:环绕通知(前),前置通知,切入点方法(发生异常前半部分),异常通知,后置通知
4. 切面
把通知应用到切入点的过程,称为切面
AOP操作
spring框架中一般都是基于AspectJ实现AOP操作。
AspectJ不是Spring组成部分,是独立AOP框架,一般把AspectJ和spring框架一起使用,进行AOP操作。
基于AspectJ实现AOP操作
- 基于xml配置文件实现
- 基于注解方式实现
切入点表达式
(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强
(2)语法结构:
- execution([权限修饰符][返回类型][类全路径]方法名称)
例如想对com.kun.Spring5.BookDao类里面的add方法进行增强 - execution(* com.kun.Spring5.BookDao.add(…))
*表示所有的修饰符(public,private等),返回值类型可以步行,…表示参数 - execution(* com.kun.Spring5.BookDao.*(…))
对类中所有方法进行增强 - execution(* com.kun.Spring5..(…))
对Spring5包下所有类中的所有方法进行增强