Spring-AOP 代理,增强
目标类 + 额外功能 = 代理类
比如:日志处理/事务处理/异常处理/性能分析…Redis 非关系型数据
- 通过spring AOP的代理功能,给代码增加额外的通用功能
- 业务逻辑就专心的处理实际需求,通用的增强功能独立出来
- 代理的专业术语
额外功能叫 增强
目标类叫 切入点 或 切面
将增强 加入到 切入点,叫编织
AOP是面向切面编程的一种实现
Spring AOP 知识点思维导图
什么是AOP?
AOP(Aspect-oriented Programming) , 名字与OOP(Object-oriented programming) 仅差一个字母, 其实它是对OOP编程的一种补充. AOP翻译过来叫面向切面编程, 核心就是这个切面. 切面表示从业务逻辑中分离出来的横切逻辑, 比如性能监控, 日志记录, 权限控制等, 这些功能都可以从核心业务逻辑代码中抽离出来. 也就是说, 通过AOP可以解决代码耦合问题, 让职责更加单一.
我们来通过代码来理解下概念, 这里有一个转账业务:
public interface IAccountService {
//主业务逻辑: 转账
void transfer();
}
public class AccountServiceImpl implements IAccountService {
@Override
public void transfer() {
System.out.println("调用dao层,完成转账主业务.");
}
}
现在有一个需求是, 在转账之前需要验证用户身份, 一般情况下我们直接就去修改源代码了:
public class AccountServiceImpl implements IAccountService { @Override public void transfer() { System.out.println("对转账人身份进行验证.");
System.out.println("调用dao层,完成转账主业务."); }
}
但作为一个"有经验"的Java开发, 我们知道 “身份验证” 这个业务完全是可以剥离出来的, 所以使用下代理设计模式的思想:
public class AccountProxy implements IAccountService { //目标对象 private IAccountService target;
public AccountProxy(IAccountService target) { this.target = target; } /** * 代理方法,实现对目标方法的功能增强 */ @Override public void transfer() { before(); target.transfer(); } /** * 身份验证 */ private void before() { System.out.println("对转账人身份进行验证."); }
}
public class Client {
public static void main(String[] args) {
//创建目标对象
IAccountService target = new AccountServiceImpl();
//创建代理对象
AccountProxy proxy = new AccountProxy(target);
proxy.transfer();
}
}
AOP的实现原理就是代理设计模式, 上面这个是静态代理, 但Spring AOP是通过动态代理实现的, 所以我们需要了解下动态代理: https://blog.csdn.net/litianxiang_kaola/article/details/85335700
AOP并不是由Spring独创, 在Spring之前就有了AOP开源框架—AspectJ, 而且AspectJ的AOP功能要比Spring更强大, 所以在Spring的后期版本中就集成了AspectJ. 但我们还是有必要了解下 Spring的AOP功能.
AOP术语
- Targe
目标对象 - Joinpoint
连接点, 所有可能被增强的方法都是连接点. - Pointcut
切入点, 将被增强的方法. - Advice
增强, 从主业务逻辑中剥离出来的横切逻辑. - Aspect
切面, 切入点加上增强就是切面. - Weaving
织入, 把切面应用到目标对象上的过程. - Proxy
代理对象, 被增强过的目标对象.
Advice常见类型
- 前置增强
org.springframework.aop.MethodBeforeAdvice, 在目标方法执行前实施增强. - 后置增强
org.springframework.aop.AfterReturningAdvice, 在目标方法执行后实施增强. - 环绕增强
org.aopalliance.intercept.MethodInterceptor, 在目标方法执行前后都实施增强. - 异常抛出增强
org.springframework.aop.ThrowsAdvice, 在方法抛出异常后实施增强. - 引入增强
org.springframework.aop.IntroductionInterceptor, 对类进行增强, 即在目标类中添加一些新的方法和属性.
Spring AOP 之编程式
我们用编程式来感受下Spring AOP. 下面例子使用的是环绕增强.
(1) 业务类
public interface IAccountService {
//主业务逻辑: 转账
void transfer();
}
public class AccountServiceImpl implements IAccountService {
@Override
public void transfer() {
System.out.println("调用dao层,完成转账主业务.");
}
}
(2) 增强
public class AccountAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
before();
Object result = invocation.proceed();
after();
return result;
}