spring Aspect 实现自定义注解的日志记录,有时候注解类不起作用的原因分析
2016-06-08 09:58
796 查看
使用只要在controller的method上加上
@ActionLog(actionGroup = "freeorder",actionType = "update",actionDesc = "操作",insertDb = true)
其中insertDb 代表是否插入数据库,默认为false。
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;
}
}
}
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代理。
@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代理。
相关文章推荐
- ASP.NET Core 中文文档 第一章 入门
- 2016-6-电商班 Asp.Net MVC4 期末复习要点
- Ajax+Asp.Net无刷新分页
- CasperJS基于PhantomJS抓取页面
- Excel 从ASP.NET 服务器下载到 本地
- Asp中Linq怎么取得表中某列的最大值
- KafkaSpout分析:配置
- Aspose.Cells 设置背景颜色
- visual studio 无法查看aspx源代码
- ASP.NET MVC 5调用其他Action
- Raspberry - 树莓派系统安装
- ASP.NET中,HiddenField隐藏控件的用法
- ASP.NET中,HiddenField隐藏控件的用法
- 【Asp.Net】五大对象
- ASP.NET调用word出错
- asp.net在word页眉插入条形码
- ASP.NET Core 中文文档
- 源码的说明 ASP.NET MVC 5框架揭秘.zip
- asp.net控件汇总
- asp.net 网页的跳转