springaop对service层日志和异常的处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
springaop对service层⽇志和异常的处理
1.aop是什么
AOP是Aspect Oriented Programming的缩写,意思是⾯向切⾯编程,与OOP(Object Oriented Programming)⾯向对象编程对等,都是⼀种编程思想。
从OOP⾓度分析,我们关注业务的处理逻辑,是属于纵向的⾏为,从AOP⾓度分析,我们关注对象⾏为发⽣时的问题,是属于横向的⾏为。
2.AOP 作⽤:
2.1 监控函数的调⽤
2.2 捕获异常发⽣
实际应⽤在:事务、安全、⽇志等横切关注。
下⾯是aop打印service层的⽅法⽇志为例:各个注解很好理解,执⾏前执⾏后等
@Component
@Aspect
public class ApiServiceAspect {
private final Logger logger = Logger.getLogger(this.getClass());
/**
* 切⾯
*/
private final String POINT_CUT = "execution(* com.demo.service.*.*.*(..))";
@Pointcut(POINT_CUT)
private void pointcut(){}
@Before(value = POINT_CUT)
public void before(JoinPoint joinPoint) {
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
StringBuilder log = new StringBuilder();
log.append("before: ")
.append(className)
.append("@")
.append(methodName)
.append(" , params: ");
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
log.append(JSONObject.toJSONString(arg) + ", ");
}
(log.toString());
}
@AfterReturning(value = "pointcut()", returning = "returnObj")
public void afterReturn(Object returnObj) {
String result = JSONObject.toJSONString(returnObj);
("afterReturning: "+result);
}
@AfterThrowing(value = POINT_CUT, throwing = "e")
public void afterThrowing(Throwable e) {
logger.error("afterThrowing: "+e.getMessage(), e);
}
@Around(value = "pointcut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Long begin = System.currentTimeMillis();
StringBuilder log = new StringBuilder("around: ");
Object result = null;
try {
result = proceedingJoinPoint.proceed();
} catch (Exception e) {
logger.error(log + e.getMessage(), e);
}
Long end = System.currentTimeMillis();
log.append(" 执⾏时间: ")
.append(end-begin)
.append("ms");
return result;
}
}
3.配置⽂件
<context:component-scan base-package="com.demo" />
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
如果使⽤了spring mvc后,如果把<aop:aspectj-autoproxy proxy-target-class="true"/>放在application.xml⽂件中可能会aop⽆效,最好把它放在dispatcher-servlet.xml⽂件中。