在spring-mvc中使用aop进行业务日志的记录
2017-11-21 16:46
639 查看
思路:自定义一个注解类,在需要记录系统业务日志(如登录、修改菜单、删除数据)的时候,在调用方法前使用该注解。定义一个切面,当系统拦截到使用自定义注解的方法的时候,执行aop切面。aop切面拦截到调用的方法后获取注解的参数,将注解的参数记录到日志文件。
流程:1、在maven中添加aop依赖,支持注解的依赖;
在springmvc配置文件中启动aspecaspecJ支持,自动扫描aop
2、创建注解类BussinessLog,注解的语法参考
3、定义类处理日志记录的逻辑,aop切面 pointcut expression表达式参考 @Around的执行顺序参考
4、注解的使用,访问requestmapping时,使用注解,进行日志的记录
参考:
https://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
http://blog.csdn.net/kkdelta/article/details/7441829
http://blog.csdn.net/rainbow702/article/details/52185827
流程:1、在maven中添加aop依赖,支持注解的依赖;
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency>
在springmvc配置文件中启动aspecaspecJ支持,自动扫描aop
<!-- 启动AspectJ支持 只对扫描过的bean有效--> <aop:aspectj-autoproxy proxy-target-class="true" />
2、创建注解类BussinessLog,注解的语法参考
@Inherited @Retention(RetentionPolicy.RUNTIME)//生命周期运行时保存 @Target({ElementType.METHOD})//注解只用于方法 public @interface BussinessLog { String module() default "";//模块名 String methoed() default "";//操作方法 }
3、定义类处理日志记录的逻辑,aop切面 pointcut expression表达式参考 @Around的执行顺序参考
/** * @author luotao * @Description 记录日志的aop,先使用pointcut expression定义一个切面 * @Date Created on 2017/11/21. */ @Aspect @Component public class LogAction { private Log log = LogFactory.getLog(LogAction.class); @Autowired private LogService logService; /** * 定义切面,使用注解BussinessLog注解的方法都会被拦截 */ @Pointcut("@annotation(com.shaun.commons.log.BussinessLog)") public void cutService(){ } /** * 配置环绕通知 * 首先获取拦截的方法对象。通过方法对象获取拦截的标注对象,获取标注参数,记录日志 * @param point * @return */ @Around(value = "cutService()") public Object around(ProceedingJoinPoint point)throws Throwable{ Object object = null; //获取拦截的方法 Signature sig = point.getSignature(); if(!(sig instanceof MethodSignature)){ throw new IllegalArgumentException("该注解只能使用在方法上!"); } MethodSignature msig = (MethodSignature) sig; //接下来通过拦截的方法名获取使用标注的方法 Method method = null; try{ method = point.getTarget().getClass().getMethod(msig.getName(),msig.getParameterTypes()); }catch (NoSuchMethodException e){ log.error(e); } //如果拦截的方法不为空,说明有方法使用了BussinessLog注解 if (method!=null){ //再次判断方法是否使用BussinessLog注解 if(method.isAnnotationPresent(BussinessLog.class)){ //获取方法使用的注解实例 BussinessLog annotation = method.getAnnotation(BussinessLog.class); LogEntity logEntity = new LogEntity(); logEntity.setModule(annotation.module()); logEntity.setMethod(annotation.methoed()); HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); UserAccount userAccount = (UserAccount) request.getSession().getAttribute("userAccountInfo"); logEntity.setUserId(userAccount.getUserId()); logEntity.setIp(CusAccessObjectUtil.getIpAddress(request)); try { object = point.proceed(); logEntity.setCommit("执行成功!"); logService.saveLog(logEntity); }catch (Throwable e){ logEntity.setCommit("发生异常!"); logService.saveLog(logEntity); } } else { object = point.proceed(); } }else { object = point.proceed(); } return object; } }
4、注解的使用,访问requestmapping时,使用注解,进行日志的记录
@BussinessLog(module = "系统登录",methoed = "首页") @RequestMapping("indexAction.do") public String IndexAction(){ return "index"; }
参考:
https://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
http://blog.csdn.net/kkdelta/article/details/7441829
http://blog.csdn.net/rainbow702/article/details/52185827
相关文章推荐
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况)
- 使用spring aop + 注解完成对业务操作的日志记录
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前和调用后记录相关日志。)
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前和调用后记录相关日志。)
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前
- 在ASP.NET MVC中使用Log4Net进行多种HttpCode日志的记录
- 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录
- Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录
- MVC使用Log4Net进行错误日志记录学习笔记4
- Spring AOP进行日志记录,管理
- Spring Boot实战之配置使用Logback进行日志记录
- Spring AOP进行日志记录,管理
- spring中使用aop记录日志
- 基于Spring AOP和Groovy日志模板配置的日志记录框架的二次实现与使用案例
- 使用Spring AOP 的@AspectJ记录日志
- spring2.x使用aop实现声明式日志记录
- Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录
- 使用Spring AOP中MethodInterceptor记录日志
- [EntLib]微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录