SpringAOP实战应用
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();
}
}
作 者:熊二哥
出 处:http://www.cnblogs.com/xiong2ge/
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
出 处:http://www.cnblogs.com/xiong2ge/
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
分类:
13Spring体系
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2016-06-22 Sublime快速入门