使用只要在controller的method上加上
@ActionLog(actionGroup = "freeorder",actionType = "update",actionDesc = "操作",insertDb = true)
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;
}
}
}
@ActionLog(actionGroup = "freeorder",actionType = "update",actionDesc = "操作",insertDb = true)
其中insertDb 代表是否插入数据库,默认为false。
1. [代码]Aspect
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;
}
}
}
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代理。
<aop:aspectj-autoproxy proxy-target-class="true" /> 交由cglib代理。

本文探讨了如何使用Spring的Aspect实现自定义注解来记录日志,同时分析了有时注解类不生效的问题。通过示例代码展示了Aspect的实现和注解类的定义。
4403

被折叠的 条评论
为什么被折叠?



