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. 【51nod1073】约瑟夫环1

    题目大意:给定 \(N\) 个人围成一个圈,每隔 \(M\) 个人杀一个,求最后活着的人的编号. 题解:环会涉及模运算,所以先将 \(1 \rightarrow N\) 映射为 \(0 \righta ...

  2. 【洛谷P1119】灾后重建

    题目大意:给定一个 N 个顶点,M 条边的无向图,每个顶点有一个时间戳,且时间戳大小按照顶点下标大小依次递增,在给定时间 t 时,时间戳严格大于 t 的顶点不能被访问,现在有 Q 次询问,每次询问在给 ...

  3. LeetCode 4.反转整数

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: ...

  4. java基础基础总结----- StringBuffer(重要)

    前言StringBuffer:(常用的方法) StringBuffer与StringBuilder的区别 关于安全与不安全的解释:

  5. windows服务写完之后怎么让它跑起来

    当然你可以在命令框里面自己去手动的敲代码,也可以写一个.bat文件一劳永逸......这里我就介绍写.bat文件的方法 就是上图所示的三个东东啦,有了这三个东东,把他们拖到你windows服务的deb ...

  6. 异步消息处理机制Handler

    Android 中的异步消息处理主要由四个部分组成,Message.Handler.MessageQueue 和Looper. 1. Message Message 是在线程之间传递的消息,它可以在内 ...

  7. win7下PLSQL Developer提示“ORA-12154: TNS:无法解析指定的连接标识符”

    解决方法:卸载掉重新安装,注意安装的目录的文件夹不要有特殊的符号,例如64位系统的的安装目录会到Program Files (x86),这时候就会出现"ORA-12154: TNS:无法解析 ...

  8. Redis记录-Redis高级应用

    Redis数据库可以使用安全的方案,使得进行连接的任何客户端在执行命令之前都需要进行身份验证.要保护Redis安全,需要在配置文件中设置密码. 示例 下面的示例显示了保护Redis实例的步骤. 127 ...

  9. JavaScript编写风格指南 (一)

    //参考<编写可维护的Javascript>  一:缩进// 第一行的层级由4个空格组成,避免使用制表符tab进行缩进 //好的写法if (true) {    doSomething() ...

  10. ios TextField限制输入两位小数

    只需要实现textField的这个代理方法就可以实现 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: ...