基本概念
AOP(Aspect Oriented Programmin)是一种不同于OOP(面向对象编程)的编程模式,它不是OOP的替代,而是对OOP的一种有益补充。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如日志、权限控制、app接口的加密解密等。实现原理
代理模式- 实际应用(基于注解)
一个app接口加密解密的例子,实现app前端传到后台的密文解密,返回给app前端的数据加密
@Component
@Aspect
public class EncryptAspect {
/**
* 切入点
*/
@Pointcut("execution(public * com.bail.api.*.controller.*Controller.*(..))")
public void pointCut() {
}
/**
* 捕获controller方法中未处理的异常
* @param ex
* @return
*/
public String afterThrowing(Throwable ex){
logger.error("系统错误!", ex);
ResultJsonBean resultBean = new ResultJsonBean();
if(ex instanceof BusinessException){
BusinessException bex = (BusinessException) ex;
resultBean.setErrorCode(bex.getErrorCode());
} else {
resultBean.setErrorCode(Apis.CODE_EXCEPTION);
}
resultBean.setErrorMessage(ex.getMessage());
return JSONObject.toJSONString(resultBean);
}
/**
*环绕通知:包围controller执行,接收请求解密,返回数据加密。
* @param joinPoint
* @return
*/
@Around(value = "pointCut()")
public Object aroundToAes(ProceedingJoinPoint joinPoint) {
Object returnVal = null;
try {
Object[] args = joinPoint.getArgs();//获取请求参数
beforeToDecrypt(args);//解密方法
returnVal = joinPoint.proceed(args);//执行请求的具体接口
returnVal = afterToEncrypt(returnVal);//对接口返回的数据加密
} catch (Throwable e) {
returnVal = afterThrowing(e);//捕获异常
}
return returnVal;
}
}