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. pat1001. Battle Over Cities - Hard Version 解题报告

    /**题目:删去一个点,然后求出需要增加最小代价的边集合生成连通图思路:prim+最小堆1.之前图中未破坏的边必用,从而把两两之间可互达的点集合 合并成一个点2.求出不同点集合的最短距离,用prim+ ...

  2. GROUP BY和 HAVING 及 统计函数 执行顺序等

    [我理解:where是对最外层结果进行条件筛选,而having是对分组时分组中的数据进行 组内条件筛选,注意:只能进行筛选,不能进行统计或计算,所有统计或计算都要放在最外层的select 后面,无论是 ...

  3. JDK 目录结构

    c:\jdk1.7.0: JDK软件安装根目录.包含版权,许可证和自述文件等. c:\jdk1.7.0\bin: 包含JDK中开发工具的可执行文件(在PATH环境变量中应该包含此目录). c:\jdk ...

  4. c#的委托用法delegate

  5. meeting,symposium,seminar 等区别

    meeting,symposium,seminar 等区别 会议分类的方式可说是不胜枚举,这点初步由英文对会议名称的写法,就可看出端倪,像是Assembly,Caucus,Colloquium, Co ...

  6. 跨域请求:JSONP

    在JavaScript中,有一个很重要的安全性限制,被称为"同源策略".即JavaScript只能访问与包含它的文档在同一域下的内容.然而,当进行一些比较深入的前端编程的时候,不可 ...

  7. HTML5 移动开发(移动设备检测及对HTML5的支持)

    1.如何选择要使用的特性以及所面向的浏览器 2.哪些浏览器支持HTML5 3.如何检测是否支持HTML5 4.如何开发贷容错性的Web应用程序 5.CSS3媒体查询如何增强检测脚本   使用HTML5 ...

  8. java代码实现图片处理功能。对图片质量进行压缩。

    java图片处理有点头疼,找了很多资料.在这里进行一个汇总,记录下个人的体验,也希望对大家有所帮助. 需求:浏览的图片需要在1M一下. 1.真正对图片的质量进行压缩的(不是通过修改图片的高,宽进行缩小 ...

  9. es6笔记(1) 概要

    什么是ES6 ECMAScript 6.0 (简称ES6) 是继ECMAScript 5.1以后的javascript 语言的下一代标准,在2015年6月份发布. 他的目标是使javascript语言 ...

  10. 让浏览器重新下载css文件,解决不刷新缓存的问题

    网站页面源代码中的css文件和js文件后面带一个问号,后面跟着一连串数字或字符,问号起不到实际作用,仅能当作后缀,如果用问号加参数的方法,可以添加版本号等信息 它的作用有:1.作为版本号,让自己方便记 ...