博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringAOP实战应用
阅读量:6147 次
发布时间:2019-06-21

本文共 4952 字,大约阅读时间需要 16 分钟。

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

基础知识

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

参考资料
http://www.cnblogs.com/best/p/5736422.html

实践

AOP配置

@Configuration@EnableAspectJAutoProxypublic class AOPConfig {}

Log(AOP)实例

@Aspect@Componentpublic 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@Componentpublic 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();    }}

转载于:https://www.cnblogs.com/xiong2ge/p/springaop_inaction.html

你可能感兴趣的文章
36.创建自定义的指令directive
查看>>
摄像头是usb_camera还是uvc_camera判定方法及ros usb_cam测试
查看>>
lua API函数大全
查看>>
Java-GC-标记压缩算法
查看>>
wordpress的手动更新
查看>>
JavaScript 命名空间
查看>>
PCB项目 X1 STC12C5A60S2-LQPF48
查看>>
[NOI2011]Noi嘉年华
查看>>
Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存
查看>>
c语言的按位运算符
查看>>
局部变量与全局变量
查看>>
[Offer收割]编程练习赛48
查看>>
Codeforces Round #374 (div.2)遗憾题合集
查看>>
[NOI2017]泳池
查看>>
麻省理工学院公开课:经典力学习题课
查看>>
对fusionchar的二次封装(插件的原理)
查看>>
开发自己的脚本引擎(二)脚本语法的设计。
查看>>
Java基础(00)
查看>>
设计模式-组合模式(10)
查看>>
Django的小记
查看>>