spring aop 实现操作日志记录

来源:互联网 发布:mac无法建立安全连接 编辑:程序博客网 时间:2024/06/05 19:54

1.自定义注解

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Logging {    /**     * 日志等级     * 例:需要保存修改记录的     * @Logging(level=AOPConstants.Key,value="用户信息修改功能",module=AOPConstants.User,type=AOPConstants.SavUpdate,mementoPos="0",mementoClass=User.class)     *      * 不需要保存修改记录,详细配置     * @Logging(level=AOPConstants.Key,value="用户信息新增功能",module=AOPConstants.User,type=AOPConstants.Add)     * 简单配置 但是此时的level为normal 等级最低,如果配置文件loglevel为3或2的时候该方法不做记录type:Add      * @Logging(value="用户信息新增功能",module=AOPConstants.User)     * @return     */    int level() default 1;    /**     * 日志详细信息 <br/>     * 支持占位符 表示第几个参数 例如:"{0},{1},..."     *      * @return     */    String value() default "";    /**     * Description: 模块<br>     *      * @author MCZ<br>     * @taskId <br>     */    String module() default "";    /**     * Description: 操作类型<br>     *      * @author MCZ<br>     * @taskId <br>     */    String type() default "Add";    /**     * Description: 记录的参数对象的位置<br>     *      * @author MCZ<br>     * @taskId <br>     */    String mementoPos() default "";    /**     * Description: 记录的参数对象的类型<br>     *      * @author MCZ<br>     * @taskId <br>     */    Class mementoClass() default Object.class;}

2.xml加入@AspectJ支持

<aop:aspectj-autoproxy />

*最好加在mvc的xml里

3.实现代码

@Aspect    @Component    public class LogAspect {           /**         * 日志记录器         */        private static Logger logger = LoggerFactory.getLogger(LogAspect.class);        @Value("${logLevel}")        private String logLevel;        /**         * 日志数据操作         */        @Autowired        private OptsLogService optsLogService;        /**         * Description: 日志记录 <br>         *          * @author MCZ<br>         * @taskId <br>         * @param point <br>         * @throws java.lang.Throwable <br>         * @return <br>         */        @Around("@annotation(xxx.xxxx.annotation.Logging)")        public Object logByAnnotation(ProceedingJoinPoint point) throws java.lang.Throwable {            // 注解式日志            MethodSignature joinPointObject = (MethodSignature) point.getSignature();            Method method = joinPointObject.getMethod();            Object result;            Logging logging = method.getAnnotation(Logging.class);// 注解式日志            }

根据@Around(“@annotation(xxx.xxxx.annotation.Logging)”)匹配,Logging logging = method.getAnnotation(Logging.class)可 获取方法的说明参数

4.使用

@Logging(level = AOPConstants.Key, value = "用户信息修改功能", module = AOPConstants.User, type = AOPConstants.SavUpdate, mementoPos = "0", mementoClass = User.class)    public void updateMergeUser(User u) {        // TODO Auto-generated method stub    }