日志切面;
日志的打印用切面拦截,切面中执行切点之前打印参数,执行切点之后打印返回的结果
方式一:用环绕通知把方法的请求,返回一起打印
@Pointcut("execution(* com.houbank.incoming.web.controller..*(..)) and @within(org.springframework.web.bind.annotation.Controller)")
private void anyAcesssAndResponseMethdod() {
}
@Around("anyAcesssAndResponseMethdod()")中打印请求参数,返回结果都在这一个环绕通知中
public Object doAround(ProceedingJoinPoint p) throws Throwable {
StringBuffer sb = new StringBuffer("类名:");
log.info(assemble(p,"doBefore"));
String targetName = p.getTarget().getClass().getName();
String methodName = p.getSignature().getName();
sb.append(targetName);
sb.append(".");
sb.append(methodName);
sb.append("()");
sb.append("--参数:");
Object result = null;
result = p.proceed();
try {
sb.append("serviceImpl_Result---"+ JSON.toJSONString(result));
sb.append("---serviceImpl_Result---END");
log.info(sb.toString());
} catch (Throwable e) {
log.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CommonLog.doAround()" + "-参数:" + sb + e.getMessage(),e);
}
log.info(assemble(p,"doAfter"));
return result;
}
方式二:用前置通知,后置通知分别打印请求,返回数
@Pointcut("execution(* com.houbank.incoming.service.impl.*.*(..))")
public void methodPointcut() {}
@Before("methodPointcut()")
public void before(JoinPoint joinPoint) {
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
//查询不记录日志
if(method.getName().startsWith("select") || method.getName().startsWith("get") || method.getName().startsWith("query")) {
return;
}
StringBuilder sb = new StringBuilder();
sb.append(method.getDeclaringClass().getSimpleName()).append(".").append(method.getName()).append(" req:");
for(int i = 0; i < joinPoint.getArgs().length; i++) {
sb.append(joinPoint.getArgs()[i]);
}
log.info(sb.toString());
}
@AfterReturning(returning="rvt", pointcut="methodPointcut()")
public void after(JoinPoint joinPoint, Object rvt) {
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
//查询不记录日志
if(method.getName().startsWith("select") || method.getName().startsWith("get") || method.getName().startsWith("query")) {
return;
}
log.info(method.getDeclaringClass().getSimpleName() + "."+ method.getName() + " resp:" + rvt);
}
然后异常通知打印异常时的日志
@AfterThrowing(value = "execution(* com.houbank.newapi.web.api..*.*(..))", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Throwable e) {
String errorMsg = assemble(joinPoint, "throwing") + e.getMessage();
log.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CommonLog.assemble()" + "-参数:" + errorMsg);
}
相关推荐
面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,它旨在提高代码的可维护性和可重用性,通过将关注点(如日志、事务管理等)从核心业务逻辑中分离出来。在Android开发中,AOP也被广泛应用于处理如...
总的来说,AspectJRT 1.5.3提供了强大的面向切面编程支持,是Java开发者实现解耦和模块化设计的有力工具。通过深入学习其API和使用示例,开发者可以更有效地利用这一框架提升代码质量和可维护性。
- **通知(Advice)执行**:AspectJRT负责执行切面中的通知方法,这些方法会在特定的连接点(Join Point)触发,如方法调用、构造函数执行等。 4. **版本1.6.6的改进与特性** - 提供了更好的性能优化,减少运行时...
Spring的AOP支持主要体现在XML配置文件中,其中包含了多种标签来定义切面、通知(advises)、切点(pointcuts)等。以下是一些关键的AOP标签及其用途: 1. `<aop:config>`:这是AOP配置的根元素,用于开启AOP功能。...
3. **面向切面编程(AOP)**: - **定义**:AOP是一种编程范式,用于将横切关注点(如日志记录、安全检查等)从业务逻辑中分离出来。 - **作用**:通过这种方式,可以减少代码重复,提高模块间代码的复用性。 4. **...
- 理解切面的定义、连接点(join points)、切入点(pointcuts)和通知(advises),以精确控制切面的插入位置。 - 避免过度使用AOP,因为它可能会增加代码的复杂性,影响可读性和调试性。 总之,AspectJ Weaver ...
标题"AopTest"暗示我们即将讨论的是面向切面编程(Aspect-Oriented Programming,简称AOP)相关的技术,这在IT行业中主要用于解决程序中的横切关注点,如日志记录、事务管理等。通常,AOP是通过一种称为切面的形式来...
AOP允许开发者定义“切面”,这些切面封装了系统的横切关注点,如日志、事务管理等。通过AOP,可以将这些关注点与业务逻辑解耦,实现更模块化的代码结构。 **Spring模块**: Spring框架由多个模块组成,包括Core ...
AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以封装跨多个类和方法的横切关注点,如日志、事务管理和安全性。AspectJRT 提供了运行时环境,使得这些切面可以在Java应用程序中无缝地工作。 在1.5.0 ...
- **通知**:通知是切面的具体行为,包括前置通知(在方法调用前执行)、后置通知(在方法调用后执行)、环绕通知(包围方法调用)、异常通知(在方法抛出异常后执行)。 - **连接点**:通知可以插入的位置,...
Spring提供了依赖注入和AOP(面向切面编程)等功能;SpringMVC是Spring的Web MVC框架,负责处理HTTP请求和响应;MyBatis是一个轻量级的持久层框架,简化了数据库操作。 3. **Java源码**:项目的实现完全基于Java语言...
3. **SSM框架集成**:Spring的依赖注入、AOP(面向切面编程)、SpringMVC的控制器设计、MyBatis的SQL映射和动态SQL。 4. **数据库设计**:涉及关系型数据库(如MySQL)的基本概念、表结构设计、SQL语句编写,以及...
7. **错误处理和日志记录**:在操作计划任务时,可能会遇到各种问题,如权限不足、任务不存在等,良好的错误处理和日志记录机制是必要的。 8. **类库封装**:ScheduleTaskUtil这样的工具类库通常会提供一套友好的...
AOP是Spring框架的一个重要特性,它允许程序员定义“切面”,这些切面可以封装关注点,如日志、事务管理、性能监控等,从而使业务代码更专注于核心功能。在实现Spring AOP时,有三个关键的jar包:aopalliance.jar、...
在Java中,代理模式是实现AOP(面向切面编程)的一种基础,例如Spring框架中的AOP就是基于动态代理实现的,它可以让我们在不修改业务代码的情况下,进行跨切面的增强操作。总的来说,代理模式是软件设计中不可或缺的...
2. **难以理解**:不同用途的代码交织在一起,影响开发人员和维护人员的理解。 3. **难以变更**:若需对系统进行升级或功能变更,开发人员需要同步修改几乎所有的相关模块。 为了解决这些问题,面向方面编程(AOP)...
- 日志切面 - 集中式会话管理 # 技术概览 ### 后端 - 基础框架:Spring Boot 2 - 持久层框架:Mybatis - 安全框架:Apache Shiro - 摸板引擎:Thymeleaf - 数据库连接池:阿里巴巴Druid - 缓存框架:Redis -...
2. **Spring框架**:Spring是Java企业级应用的主流框架,提供依赖注入、事务管理、AOP(面向切面编程)等功能,有助于构建松耦合的系统。 3. **JDBC与数据库操作**:Java Database Connectivity允许Java程序与各种...
3. **aspectjweaver.jar**:AspectJ是一个面向切面编程(AOP)的Java扩展,用于添加跨切面的关注点,如日志、事务管理等。在Struts 2或Spring框架中,它可以用来实现更细粒度的控制和模块化。 4. **ojdbc14.jar**:...