1. 创建接口注解日志类

    package com.fh.service.logAop;
    
    /**
    * Created by caozengling on 2018/7/21.
    */ import java.lang.annotation.*; /**
    * 日志切面注解
    */ @Target({ ElementType.METHOD, ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface MethodLog { String remark() default "";
    String operType() default "0";
    // String desc() default "";
    }
  2. 切面实现
    package com.fh.service.logAop;
    
    /**
    * Created by caozengling on 2018/7/21.
    */ import com.fh.dao.DaoSupport;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes; import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import java.awt.geom.Area;
    import java.lang.reflect.Method;
    import java.text.SimpleDateFormat;
    import java.util.Calendar; /**
    * 日志切面实现
    */ @Component
    @Aspect
    public class LogService { @Resource(name = "daoSupport")
    private DaoSupport dao; public LogService() {
    System.out.println("Aop");
    } /**
    * 切点
    */
    @Pointcut("@annotation(com.fh.service.logAop.MethodLog)")
    public void methodCachePointcut() { } /**
    * 切面
    *
    * @param point
    * @return
    * @throws Throwable
    */
    @Around("methodCachePointcut()")
    public Object around(ProceedingJoinPoint point) throws Throwable { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
    .getRequestAttributes()).getRequest();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
    Calendar ca = Calendar.getInstance();
    String operDate = df.format(ca.getTime());
    String loginName;
    String name;
    String methodRemark = getMthodRemark(point);
    String methodName = point.getSignature().getName();
    String packages = point.getThis().getClass().getName();
    if (packages.indexOf("$$EnhancerByCGLIB$$") > -1) { // 如果是CGLIB动态生成的类
    try {
    packages = packages.substring(0, packages.indexOf("$$"));
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    String operatingcontent = "";
    Object[] method_param = null; Object object;
    try {
    method_param = point.getArgs(); //获取方法参数
    // String param=(String) point.proceed(point.getArgs());
    object = point.proceed();
    } catch (Exception e) {
    // 异常处理记录日志..log.error(e);
    throw e;
    } Area area = (Area) method_param[0]; // System.out.println("日志实体:"+sysLog.getLoginName()+sysLog.getMethodRemark()+sysLog.getOperatingcontent());
    return object; } /**
    * 方法异常时调用
    *
    * @param ex
    */
    public void afterThrowing(Exception ex) {
    System.out.println("afterThrowing");
    System.out.println(ex);
    } /**
    * 获取方法中的中文备注
    *
    * @param joinPoint
    * @return
    * @throws Exception
    */
    public static String getMthodRemark(ProceedingJoinPoint joinPoint) throws Exception { String targetName = joinPoint.getTarget().getClass().getName();
    String methodName = joinPoint.getSignature().getName();
    Object[] arguments = joinPoint.getArgs(); Class targetClass = Class.forName(targetName);
    Method[] method = targetClass.getMethods();
    String methode = "";
    for (Method m : method) {
    if (m.getName().equals(methodName)) {
    Class[] tmpCs = m.getParameterTypes();
    if (tmpCs.length == arguments.length) {
    MethodLog methodCache = m.getAnnotation(MethodLog.class);
    if (methodCache != null) {
    methode = methodCache.remark();
    }
    break;
    }
    }
    }
    return methode;
    }
    }
  3. 方法切入,这里只是举个例子,具体逻辑切入点请自行添加。
  4. 依赖:
  5. springboot:
    <!--spring切面aop依赖-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    </dependency> 在application.properties文件里加这样一条配置
    spring.aop.auto=true spring mvp :
    在ApplicationContext-mvc.xml 中添加以下配置:
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    
    

Spring AOP 切面实现操作日志的更多相关文章

  1. springboot—spring aop 实现系统操作日志记录存储到数据库

    原文:https://www.jianshu.com/p/d0bbdf1974bd 采用方案: 使用spring 的 aop 技术切到自定义注解上,针对不同注解标志进行参数解析,记录日志 缺点是要针对 ...

  2. Spring Boot 2.X(八):Spring AOP 实现简单的日志切面

    AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一 ...

  3. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  4. 利用Spring AOP切面对用户访问进行监控

    开发系统时往往需要考虑记录用户访问系统查询了那些数据.进行了什么操作,尤其是访问重要的数据和执行重要的操作的时候将数记录下来尤显的有意义.有了这些用户行为数据,事后可以以用户为条件对用户在系统的访问和 ...

  5. Spring AOP切面的时候参数的传递

    Spring AOP切面的时候参数的传递 Xml: <?xml version="1.0" encoding="UTF-8"?> <beans ...

  6. spring AOP(切面) 表达式介绍

    在 spring AOP(切面) 例子基础上对表达式进行介绍 1.添加接口删除方法 2.接口实现类 UserDaoServer 添加实现接口删除方法 3.测试类调用delUser方法 4. 输出结果截 ...

  7. 使用Spring AOP切面解决数据库读写分离

    http://blog.jobbole.com/103496/ 为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如 ...

  8. 【spring】aop切面通知,日志处理

    1.spring的切面编程 概念原理可以看这里:http://blog.csdn.net/moreevan/article/details/11977115 2.所需要的jar包 maven引入jar ...

  9. Spring AOP 实现写事件日志功能

    什么是AOP?AOP使用场景?AOP相关概念?Spring AOP组件?如何使用Spring AOP?等等这些问题请参考博文:Spring AOP 实现原理 下面重点介绍如何写事件日志功能,把日志保存 ...

随机推荐

  1. ubuntu16.04 dpkg强制安装 teamviewer

    dpkg遇到安装有依赖,而依赖的包有无法安装的时候,可以试试强制安装: .90154_amd64.deb 虽然报错,但是安装后还是可以使用. 如果使用: .90154_amd64.deb 提示下面错误 ...

  2. 关于HTTP协议及SOCKET通信

    一.HTTP 1.报文结构 HTTP:超文本传输协议,报文分为请求报文和响应报文. 2.端口(tomcat端口) http在熟知的80端口使用TCP的服务:tomcat的默认端口是8080 3.状态码 ...

  3. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON

    视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影. 前面的文章中,我们已经完成了项目中常见的问题,比如 路由 ...

  4. Python 遍历文件夹 listdir walk 的区别

    一.一级目录import os path = 'd:\file'; for filename in os.listdir(path): print(os.path.join(path,filename ...

  5. IDEA artifacts Web Application:Exploded Web Application:Archive

    首先,artifacts是maven中的一个概念,表示项目/modules如何打包,比如jar,war,war exploded,ear等打包形式,一个项目或者说module有了artifacts 就 ...

  6. $(this).form("validate") 始终返回false

    onsubmit 提交前触发,返回 false 来阻止提交动作. validate 进行表单字段验证,当全部字段都有效时返回 true .该方法和 validatebox 插件一起使用. 解决:注释掉 ...

  7. RN中关于组件中属性的传递

    比如: 组件A想要给组件B中的组件C传递一个属性prop class A extends Component{ render(){ return( <B title = "这是一个标题 ...

  8. linux的文件类型和权限

    Linux下使用ll或ls -l查看文件的信息 (ll和ls-l的区别:ll会显示出当前目录下的隐藏文件,而ls -l不会)   文件信息分为:文件类型.权限.链接数.所属用户.所属用户组.文件大小. ...

  9. 基于MSAA的QQ界面信息获取的实现

    主要技术(Microsoft Active Accessibility)讲解: 以下是微软对于此技术的说明 Microsoft Active Accessibility Version 2.0 Pur ...

  10. 二叉树中的最大路径和 · Binary Tree Maximum Path Sum

    [抄题]: 给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和) [思维问题]: 不会写分合法 [一句话思路]: 用两次分治:ro ...