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

本文探讨了如何使用Spring的Aspect实现自定义注解来记录日志,同时分析了有时注解类不生效的问题。通过示例代码展示了Aspect的实现和注解类的定义。
使用只要在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代理。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值