AOP => Aspect Oriented Programming 面向切面编程
通过预编译方式和运行期代理实现程序功能同一维护的技术,AOP是OOP的延续
采用横向抽取,取代传统纵向继承体系
可以进项性能监视,事务管理,安全检查,缓存的操作
DAO=> data access object
数据访操作
如果想对功能进行检查扩展
public class UserDAOImpl implements UserDAO{
public void save(User user){
//保存用户
}
public void update(User user){
//更新用户
}
public void find(User user){
//查询用户
}
}
传统方法,先写父类方法,由子类继承
public class BaseDAOImpl{
public void checkPrivilege(){}
}
public class UserDAOImpl extends BaseDAOImpl{
public void save(User user){
checkPrivilege()
//
}
...
}
AOP的方法采用横向抽取机制 (代理)
public class UserDAOImpl implements UserDAO{
public void save(User user){
//保存用户
}
对接口生成代理
UserDAOImpl => Proxy
AOP使用纯java实现,不需要专门的编译过程和类加载器,运行期通过代理方式向目标类植入增强代码
相关术语
- Joinpoint(连接点): 哪些点可以被拦截=> 在spring中为方法
- Pointcut(切入点): 将要对哪些Joinpoint进行拦截
- Advice(增强): 拦截到Joinpoint后的操作(前置,后置,环绕,异常,最终)
- Introduction(引介):是一种特殊的通知,在不修改代码的情况下,在运行期间动态添加方法
- Target(目标对象): 代理的目标对象
- Weaving(织入): 把增强应用到目标来创建代理对象的过程(spring采用动态代理)
- Proxy(代理): 一个类被增强后产生的结果类
- Aspect(切面): 是切入点和通知(引介)的结合
图
底层实现原理
- JDK动态代理 (通过接口生成代理)
- CGLIB动态代理 (通过子类生成代理)
程序中应优先对接口创建代理,便于程序解耦
标记为final的方法,不能被代理,因为无法被覆盖
spring只支持方法连接点,不提供属性连接点
Spring AOP增强类型
AOP联盟为advice定义了org.aopalliance.aop.Interface.Advice
Spring 按照通知在目标类方法的连接点位置,设置5种
- 前置通知 org.springframework.aop.MethodBeforeAdvice
在目标方法执行前实施增强 - 后置通知 org.springframework.aop.AfterReturningAdvice
在目标方法执行后实施增强 - 环绕通知 org.springframework.aop.MethodInterceptor
在目标执行前后 - 异常通知 org.springframework.aop.ThrowsAdvice
在方法跑出异常后实施增强 - 引介通知
Spring AOP切面
advisor: 代表切面
PointcutAdvisor: 代表具有切点的切面,可以指定拦截目标类哪些方法
IntroductionAdvisor: 代表引介切面,针对引介通知而使用切面
不需要写传统增强
设置配置即可
配置:基本spring包+ aop联盟包 + springAOP