Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志

本文内容纲要:Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志

一、spring aop execution表达式说明

在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点"

例如定义切入点表达式 execution(* com.sample.service.impl..*.*(..))

execution()是最常用的切点函数,其语法如下所示:

整个表达式可以分为五个部分:

1、execution(): 表达式主体。

2、第一个*号:表示返回类型,*号表示所有的类型。

3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。

4、第二个*号:表示类名,*号表示所有的类。

5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

二、程序

1.要记录日志的某个方法: updatePromote

/**

* 修改商品活动

* @param vo

* @param promoteId为,AOP监控的查询ID

* @return

* @throws Exception

*/

public ResultVO updatePromote(PromoteVO vo,Long promoteId)throws Exception;

2.增加一个横切关注点,打印日志,Java类为

package com.fortis.drugstore.web.userdbThrift.aop;

import java.util.Date;

import org.apache.log4j.Logger;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import com.fortis.drugstore.base.action.BaseAction;

import com.fortis.drugstore.system.utils.SessionInfo;

import com.fortis.drugstore.web.userdbThrift.activity.service.PromoteService;

import com.fortis.thrift.userdb.PromoteVO;

//声明这是一个组件

@Component

//声明这是一个切面Bean

@Aspect

public class ServiceAspect extends BaseAction<Object>{

private static final long serialVersionUID = 7690224540336380592L;

private final static Logger log = Logger.getLogger(ServiceAspect.class);

@Autowired

private PromoteService service;

//配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点

@Pointcut("execution(* com.fortis.drugstore.web.userdbThrift.activity.service.impl..PromoteServiceImpl.updatePromote(..))")

public void aspect(){ }

/*

* 配置前置通知,使用在方法aspect()上注册的切入点

* 同时接受JoinPoint切入点对象,可以没有该参数

*/

@Before("aspect()")

public void before(JoinPoint joinPoint){

PromoteVO obBefore = new PromoteVO();

Object []param = joinPoint.getArgs();

if(log.isInfoEnabled()){

Object promoteId = param[1]; //切点中有两个参数,第二个为表的主键,用于查询

SessionInfo sessionInfo = (SessionInfo) getSession().getAttribute("sessionInfo");

try {

obBefore = service.queryPromoteDetail(Long.valueOf(promoteId.toString()));

} catch (Exception e) {

e.printStackTrace();

}

log.info("【修改活动数据】:"+new Date()+" 【账号】:"+sessionInfo.getUserAcct()+" 【名称】:"+sessionInfo.getUserName());

log.info("修改之前:"+obBefore.toString());

}

}

//配置后置通知,使用在方法aspect()上注册的切入点

@After("aspect()")

public void after(JoinPoint joinPoint){

PromoteVO obAfter = new PromoteVO();

Object []param = joinPoint.getArgs();

if(log.isInfoEnabled()){

Object promoteId = param[1];

try {

obAfter = service.queryPromoteDetail(Long.valueOf(promoteId.toString()));

} catch (Exception e) {

e.printStackTrace();

}

log.info("修改之后:"+obAfter.toString());

}

}

}

3.spring aop的配置文件 spring-aop.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd

http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd

http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<!-- 激活自动代理功能 -->

<aop:aspectj-autoproxy proxy-target-class="true"/>

</beans>

本文内容总结:Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志

原文链接:https://www.cnblogs.com/qiuren/p/6068518.html

以上是 Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志 的全部内容, 来源链接: utcz.com/z/296916.html

回到顶部