1. 啥是AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
- AOP采取横向抽取机制,解决公共功能的重复性代码(性能监视、事务管理、安全检查、缓存)
Spring AOP是使用纯java实现,不需要专门的编译过程和类加载,在运行期通过代理方式向目标类织入增强代码。
2. 为啥要AOP
举个栗子:
需求1:要为某项save功能添加鉴权功能。
传统的开发模式:在相关的类添加鉴权的方法,在该功能中添加调用该方法。
需求2:客户对这个鉴权功能很满意,要求为涉及到的所有模块的save功能都加上该功能。
传统的开发模式:如果再像上面那样在具体的实现类中重复定义鉴权方法就太傻了。那就把该方法抽取到一个base类中,相关方法都继承base类,从而做到方法的重用。
引入AOP:采用横向抽取机制代替纵向继承。本质上这个横向抽取就是一个代理操作。抽取一个鉴权代理类,在代理类中增加对相关功能的鉴权操作,无需对原有的业务类进行修改。
3. AOP相关术语
- JoinPoint(连接点):可以被拦截的点。在spring中,这些点指的是方法,因为spring中只支持方法类型的连接点。
- Pointcut(切入点):真正被拦截的点。
- Advice(通知/增强):拦截后要做的事。比如上面的示例中checkPrivilege方法。
- 前置通知:方法执行之前执行
- 后置通知:方法执行之后执行,无论成功执行还是抛出异常
- 最终通知:方法成功执行之后执行,异常或者错误不执行
- 异常通知:方法抛出异常之后才执行,成功时不执行
- 环绕通知:包括以上四中注解
- Target(目标):被增强的目标对象。
- Weaving(织入):把增强的技能加入到目标对象来创建新的代理对象的过程。如小明->会唱歌的小明这个过程。
- spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。
- Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类。
- Aspect(切面):是切入点和通知的结合。