Springboot中使用AOP特性非常简单,使用@AspectJ注解,然后再配置中开启AspectJ即可。在日常的应用,有时可以将日志记录和异常处理在一个拦截器中统一处理,但有时在项目中无法通过一个拦截器解决所有切面问题,此时,就需要将日志、异常处理等拦截器功能拆分开来,但有一点是相同的,就是在需要时增加一个抽象层次用于拦截。

基础知识

这部分的细节主要是注解的使用,可以参看之后示例。

参考资料

http://www.cnblogs.com/best/p/5736422.html

实践

AOP配置

@Configuration
@EnableAspectJAutoProxy
public class AOPConfig {
}

Log(AOP)实例

@Aspect
@Component
public final class LogInterceptor {
private final static int DEFAULT_MAX_LOG_LENGTH = 8192; @Pointcut("execution(* com.bjork.ws.XXXWSImplForSpring.*(..))")
public void serviceMethodPointcut() {
} @Pointcut("execution( * com.bjork.ws.agent..*.*(..)) && @annotation(com.bjork.ws.core.AgentOriginalMethod)")
public void agentOriginalMethodPointcut() {
} @Around("serviceMethodPointcut() || agentOriginalMethodPointcut()")
// @Around("agentOriginalMethodPointcut()")
public Object Interceptor(ProceedingJoinPoint pjp) throws Throwable {
// 获取aop相关信息
Signature signature = pjp.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method targetMethod = methodSignature.getMethod();
Class<?> returnType = targetMethod.getReturnType();
Object result = null;
Logger logger = LoggerFactory.getLogger(pjp.getTarget().getClass()); try {
// 设置默认返回值
result = returnType.newInstance(); logger.info(String.format("%s方法调用开始!", targetMethod.getName()));
// 约定只有一个参数
Object uniqueParameter = pjp.getArgs()[0];
logRequest(JsonHelper.serialize(uniqueParameter), logger);
result = pjp.proceed();
logResponse(JsonHelper.serialize(result), logger);
} finally {
logger.info(String.format("%s方法调用结束!", targetMethod.getName()));
}
return result;
} protected void logRequest(String requestString, Logger logger) {
if (requestString.length() <= DEFAULT_MAX_LOG_LENGTH)
logger.info(String.format("请求体为:%s", requestString));
} protected void logResponse(String responseString, Logger logger) {
if (responseString.length() <= DEFAULT_MAX_LOG_LENGTH)
logger.info(String.format("响应体为:%s", responseString));
}
}

Exception (AOP)实例

@Aspect
@Component
public final class ServiceInterceptor {
@Pointcut("execution(* com.bjork.ws.service..*(..)) "
+ "&& @annotation(com.bjork.ws.core.ServiceOpenMethod)")
public void serviceMethodPointcut() {
} @Around("serviceMethodPointcut()")
public GenericResult Interceptor(ProceedingJoinPoint pjp) {
// 获取aop相关信息
Signature signature = pjp.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method targetMethod = methodSignature.getMethod();
// Class<?> returnType = targetMethod.getReturnType();
GenericResult result = new GenericResult();
Logger logger = LoggerFactory.getLogger(pjp.getTarget().getClass()); try {
// 设置默认返回值
// result = returnType.newInstance(); // 约定只有一个参数
Object uniqueParameter = pjp.getArgs()[0];
result = (GenericResult) pjp.proceed();
} catch (ValidException vex) {
result.getResultInfo().setIsSuccessful(false);
result.getResultInfo().setCode(vex.getErrorCode());
result.getResultInfo().setMessage(vex.getMessage());
logger.info(vex.getMessage());
} catch (BizException bex) {
result.getResultInfo().setIsSuccessful(false);
result.getResultInfo().setCode(bex.getErrorCode());
result.getResultInfo().setMessage(bex.getMessage());
logger.warn(bex.getMessage());
} catch (ExternalCallException ecex) {
result.getResultInfo().setIsSuccessful(false);
result.getResultInfo().setCode(ecex.getErrorCode());
result.getResultInfo().setMessage(ecex.getMessage());
logger.warn(ecex.getMessage());
} catch (Throwable ex) {
result.getResultInfo().setIsSuccessful(false);
result.getResultInfo().setCode(ExceptionInfo.SYSTEM_EXCEPTION_CODE);
result.getResultInfo().setMessage(ExceptionInfo.SYSTEM_EXCEPTION_MESSAGE);
logger.error(ex.getMessage(), ex);
} finally {
}
return result;
}
}

AutoConfiguration配置

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
//@SpringBootApplication
@ComponentScan("com.xxx.ws")
public class ServiceInitializer extends SpringBootServletInitializer { @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ServiceInitializer.class);
} @Bean
public LogAspect logAspect() {
return new LogAspect();
} @Bean
public ServiceExceptionAspect serviceExceptionAspect() {
return new ServiceExceptionAspect();
}
}

SpringAOP实战应用的更多相关文章

  1. SpringAOP+RabbitMQ+WebSocket实战

    背景 最近公司的客户要求,分配给员工的任务除了有微信通知外,还希望PC端的网页也能实时收到通知.管理员分配任务是在我们的系统A,而员工接受任务是在系统B.两个系统都是现在已投入使用的系统. 技术选型 ...

  2. 学习笔记——Maven实战(三)多模块项目的POM重构

    重复,还是重复 程序员应该有狗一般的嗅觉,要能嗅到重复这一最常见的坏味道,不管重复披着怎样的外衣,一旦发现,都应该毫不留情地彻底地将其干掉.不要因为POM不是产品代码而纵容重复在这里发酵,例如这样一段 ...

  3. Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)

    前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...

  4. Spring-AOP用法总结

    前言     Spring AOP的实现方法很多,在项目开发中具体采用什么方式,需要按实际情况来选择,每一种的用法,有其一定的实用价值,所以本文将各种使用方法进行了具体实现.主要包括Advice的be ...

  5. MySQL多数据源笔记5-ShardingJDBC实战

    Sharding-JDBC集分库分表.读写分离.分布式主键.柔性事务和数据治理与一身,提供一站式的解决分布式关系型数据库的解决方案. 从2.x版本开始,Sharding-JDBC正式将包名.Maven ...

  6. SpringAOP深入学习

    ----------------------Spring AOP介绍------------------ 1.编程范式概念 面向过程编程:C 面向对象编程:c++,Java 函数式编程 事件驱动编程: ...

  7. Spring Boot 揭秘与实战(一) 快速上手

    文章目录 1. 简介 1.1. 什么是Spring Boot 1.2. 为什么选择Spring Boot 2. 相关知识 2.1. Spring Boot的spring-boot-starter 2. ...

  8. 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程

    我们在之前的文章中中已经讲到了正确部署运行cas server 和 在cas client中配置. 在此基础上 我们去掉了https的验证,启用了http访问的模式. 单点登录(七)-----实战-- ...

  9. Spring3实战第一章 Aop 切面 XML配置

    刚看spring3实战书籍第一章  切面以前没有关注过 现在看到了  随手试验一下 AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Objec ...

随机推荐

  1. Eclipse中创建java类的时候自动设置作者信息和创建时间

    window—>preferences—>Java—>Code Stype—>Code Templates Code—>New Java files 点击Edit ${f ...

  2. 【LOJ#10064】黑暗城堡

    题目大意:定义一个无向图的最短路径生成树如下:在该无向图的生成树中,任意一个节点到根节点的距离均等于根节点到该节点的最短路.求有多少种最短路径生成树. 题解:首先跑一遍 dij 求出从根节点到每个节点 ...

  3. 如何获取codeforces的完整数据

    推荐: 如何获取codeforces的完整数据?(玄学方法) http://www.cnblogs.com/Saurus/p/6220513.html

  4. gdb调试遇到的问题

    解决方法:http://stackoverflow.com/questions/31062010/ubuntu-14-04-gcc-4-8-4-gdb-pretty-printing-doesnt-w ...

  5. P2073 送花

    P2073 送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花 ...

  6. C#的Struct

  7. html5 canvas旋转+缩放

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 移动端手势库hammerJS 2.0.4官方文档翻译(转)

    hammerJS是一个优秀的.轻量级的触屏设备手势库,现在已经更新到2.04版本,跟1.0版本有点天壤地别了,毕竟改写了事件名并新增了许多方法,允许同时监听多个手势.自定义识别器,也可以识别滑动方向. ...

  9. Javascript中与Scroll有关的方法

    这块确实太乱了,被兼容搞的简直快要晕死,默默地总结下... 与scroll相关的方法 4个window对象下:scrollX.scrollY.scrollTo.scroll(作用和scrollTo一样 ...

  10. 使用 scm-manager 搭建 git/svn 代码管理仓库(一)

    1.在官网上下载scm-manager 下载地址  https://www.scm-manager.org/download/ 选择下载文件 2. 配置java 环境 参照文章:https://jin ...