您的位置:首页 > 编程语言 > ASP

spring Aspect 实现自定义注解的日志记录,有时候注解类不起作用的原因分析

2016-06-08 09:58 796 查看
使用只要在controller的method上加上

@ActionLog(actionGroup = "freeorder",actionType = "update",actionDesc = "操作",insertDb = true)

其中insertDb 代表是否插入数据库,默认为false。


1. [代码]Aspect

package com.actionlog.aspect.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 加上controller 层方法上annotation

*/

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

public @interface ActionLog {

/**

* 当前操作组别

* 一般以 Controller 的 RequestMapping命名

* @return

*/

String actionGroup() default "";

/**

* 操作类型

* 一般定义/create, /update, /delete分别表示是新增,修改,删除

* @return

*/

String actionType() default "";

/**

* 操作描述

* @return

*/

String actionDesc() default "";

/**

* 是否插入该条操做纪录至数据库

* @return

*/

boolean insertDb() default false;

BackupTypeEnum backupType() default BackupTypeEnum.COMMON_BACKUP;

/**

* 插入纪录时 在HttpServletRequest中的key

* @return

*/

String primaryKey() default "id";

/**

* 插入纪录时 所需要调用的注解到SPRING中的service bean name, 通过该类去数据库查找当前操做数据的原始记录 以及操做完后的值

* @return

*/

String serviceBeanClassName() default "";

/**

* 根据primaryKey 在service层掉用查数据库的方法名

* @return

*/

String findByPrimaryKeyMethodName() default "findByPrimaryKey";

/**

* 操作人在的HttpServletRequest中的key(对于非后台请求我们没法中CAS中查到操做人, 所以需要在controller的请求方法中传递给属性)

* @return

*/

String operatorKey() default "operator";

/**

* 定义插入数据库时的逻辑,当 ActionLog 属性insertDb=true时才有效

*/

public enum BackupTypeEnum{

COMMON_BACKUP("1","通用操作记录保存,只保存入参和返回值"),

BACKUP_DATA("2","先将原有数据记录备份后再更新数据"); //这个一般是对于更新操作

private String code;

private String msg;

private BackupTypeEnum(String code, String msg) {

this.code = code;

this.msg = msg;

}

public String getCode() {

return code;

}

public String getMsg() {

return msg;

}

}

}


2. [代码]注解类

package com.aspect.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 加上controller 层方法上annotation

*/

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

public @interface ActionLog {

/**

* 当前操作组别

* 一般以 Controller 的 RequestMapping命名

* @return

*/

String actionGroup() default "";

/**

* 操作类型

* 一般定义/create, /update, /delete分别表示是新增,修改,删除

* @return

*/

String actionType() default "";

/**

* 操作描述

* @return

*/

String actionDesc() default "";

/**

* 是否插入该条操做纪录至数据库

* @return

*/

boolean insertDb() default false;

BackupTypeEnum backupType() default BackupTypeEnum.COMMON_BACKUP;

/**

* 插入纪录时 在HttpServletRequest中的key

* @return

*/

String primaryKey() default "id";

/**

* 插入纪录时 所需要调用的注解到SPRING中的service bean name, 通过该类去数据库查找当前操做数据的原始记录 以及操做完后的值

* @return

*/

String serviceBeanClassName() default "";

/**

* 根据primaryKey 在service层掉用查数据库的方法名

* @return

*/

String findByPrimaryKeyMethodName() default "findByPrimaryKey";

/**

* 操作人在的HttpServletRequest中的key(对于非后台请求我们没法中CAS中查到操做人, 所以需要在controller的请求方法中传递给属性)

* @return

*/

String operatorKey() default "operator";

/**

* 定义插入数据库时的逻辑,当 ActionLog 属性insertDb=true时才有效

*/

public enum BackupTypeEnum{

COMMON_BACKUP("1","通用操作记录保存,只保存入参和返回值"),

BACKUP_DATA("2","先将原有数据记录备份后再更新数据"); //这个一般是对于更新操作

private String code;

private String msg;

private BackupTypeEnum(String code, String msg) {

this.code = code;

this.msg = msg;

}

public String getCode() {

return code;

}

public String getMsg() {

return msg;

}

}

}

自定义注解类你要起作用的关键在于

由于直接拦截所有的controller所以需要mvc-servlet.xml中添加

<aop:aspectj-autoproxy proxy-target-class="true" /> 交由cglib代理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: