文档章节

通过自定义注解,和Spring 的aop 实现插入业务日志的功能

中国扛把子
 中国扛把子
发布于 2018/08/27 16:08
字数 690
阅读 39
收藏 0

首先当然是定义一个注解类型了:

/**
 * 
 * 日志切面注解
 * @Description: TODO <p>MethodLog.java</p>
 * @作者: 王彦宝
 * @时间: 2018年8月24日上午10:08:08
 * @version V1.0
 * @see java.lang.Class
 * @since JDK{jdk1.7}
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodLog {

    String content() default "";
    MethodLogType operType() default MethodLogType.QUERY;
}

在这个注解中我定义了两个参数:一个是content:这个是日志的主要内容,一个是operType : 日志类型。

其中MethodLogType  是我自己定义的一个枚举类:

/**
 * methodLog注解参数 operType 的枚举值
 * 
 * @Description: TODO <p>MethodLogType.java</p>
 * @作者: 王彦宝
 * @时间: 2018年8月24日下午2:21:57
 * @version V1.0
 * @see java.lang.Class
 * @since JDK{jdk1.7}
 */
public enum MethodLogType {

	/* 查询 */
	QUERY,
	/* 新增 */
	ADD,
	/* 修改 */
	UPDATE,
	/*导出*/
	EXPORTS,
	/*导入*/
	IMPORTS,
	/* 删除 */
	DELETE;
}

下面就要通过spring  的aop  实现业务日志插入数据库了:

@Component
@Aspect   //
public class LogService {

	
	 	@Resource(name = "SaveLogDao")
	    private SaveLogDao dao;

	    public LogService() {
	    }

	    /**
	     * 切点
	     */
	    @Pointcut("@annotation(com.eimageglobal.iq.client.util.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 methodRemark = getMthodRemark(point);
	        String methodOpertype = getMthodOperType(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=null;
	        try {
	            method_param = point.getArgs(); //获取方法参数
	            dao.save(dolog);
	            String param=(String) point.proceed(point.getArgs());
//	            object = point.proceed();
	        } catch (Exception e) {
	            // 异常处理记录日志..log.error(e);
	             e.printStackTrace();
	        }
	        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;
	    }
	    
	    /**
	     * 获取方法中的中文备注
	     *
	     * @param joinPoint
	     * @return
	     * @throws Exception
	     */
	    public static String getMthodOperType(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();
	        MethodLogType methode = null;
	        String type="";
	        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.operType();
	                    }
	                    break;
	                }
	            }
	        }
	        return type=LogType.getName(methode.toString());
	    }

在spring -source.xml  中通过bean  注入  :

<bean id="SaveLogDao" class="com.eimageglobal.iq.biz.dao.impl.SaveLogDaoImpl"/>

这里的SaveLogDao  就是  LogService  中  
         @Resource(name = "SaveLogDao")
        private SaveLogDao dao;

       这里的用到。

在业务代码中的使用样例:

/**
	 *
	 * @param request
	 * @param response
	 * @作者: 王彦宝
	 * @时间: 2018年8月24日下午4:00:55
	 * @返回 void
	 */
	@RequestMapping(value = "XXXXXXXXX")
	@MethodLog(content="这里是你要插入的日志内容",operType=MethodLogType.UPDATE)
  	public void updateSort(HttpServletRequest request, HttpServletResponse response){
		
	}

这样在你需要插入日志的地方加这样一个注解就ok 了

© 著作权归作者所有

中国扛把子
粉丝 5
博文 44
码字总数 17631
作品 0
杭州
程序员
私信 提问
SpringBoot(四)之优雅地日志处理

一、简介 日志功能在j2ee项目中是一个相当常见的功能,在一个小项目中或许你可以在一个个方法中,使用日志表的Mapper生成一条条的日志记录,但这无非是最烂的做法之一,因为这种做法会让日志...

郑加威
2018/12/23
0
0
Spring boot自定义注解方式实现日志记录

Annontation是Java5开始引入的新特性,中文名称叫注解。 一、常见注解 1.1 JDK自带注解 @Override:表示覆盖或重写父类的方法。 @Deprecated:表示该方法已经过时了。 @suppressWarnings:表...

Lienson
03/28
0
0
Spring AOP 的实现方式(以日志管理为例)

Spring AOP 的实现方式(以日志管理为例) 2016年10月08日 00:13:57 阅读数:23198 在学习Spring框架的历程中,最重要的是要理解Spring的IOC和AOP了,不但要学会怎么用,最好是知道它是怎么实...

Jeam_
2018/07/04
0
0
在Spring-Boot中实现通用Auth认证的几种方式

前言 最近一直被无尽的业务需求淹没,没时间喘息,终于接到一个能让我突破代码舒适区的活儿,解决它的过程非常曲折,一度让我怀疑人生,不过收获也很大,代码方面不明显,但感觉自己抹掉了 ...

枕边书
2018/07/17
0
0
2019年一线大厂春招:Spring面试题和答案合集(下篇)

其他面试答案参考:2019年一线大厂春招:Spring面试题和答案合集(上篇) 35. @RequestMapping 注解 该注解是用来映射一个URL到一个类或一个特定的方处理法上。 36. 什么是基于Java的Spring注...

别打我会飞
04/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spark内置图像数据源初探

概述 在Apache Spark 2.4中引入了一个新的内置数据源, 图像数据源.用户可以通过DataFrame API加载指定目录的中图像文件,生成一个DataFrame对象.通过该DataFrame对象,用户可以对图像数据进行简...

阿里云官方博客
18分钟前
4
0
掌握Composer

这一次,真正掌握composer composer是现代PHP的基石 现代高级编程语言,依赖管理工具是必不可少的。Java有Maven,Python有pip,Nodejs有npm, 而在composer出现之前,PHP只有被广为诟病的Pea...

城市之雾
25分钟前
3
0
Shell中的函数、数组、告警系统

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.20 告警系统主脚本 20.21 告警系统配置文件 20.22 告警系统监控项目 20.23/20.24/20.25 告警系统邮件引擎 20.26 ...

tobej
25分钟前
1
0
Win7系统安装hadoop

环境准备 安装JDK1.8,配置JAVA_HOME 下载hadoop_3.1.2,配置HADOOP_HOME 配置HDFS 修改hadoop-env.cmd 增加 set HADOOP_PREFIX=%HADOOP_HOME%set HADOOP_CONF_DIR=%HADOOP_PREFIX%\etc\ha......

铲平王
29分钟前
1
0
IT兄弟连 Java语法教程 Java语言的其他特性

Java语言中除了非常重要的跨平台特性外,还有如下几个关键特性: ● 语法简单易学 Java语言的语法简单明了,容易掌握,而且是纯面向对象(OOP)的语言,Java语言的简单性主要体现在以下几个方...

老码农的一亩三分地
42分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部