spring aop自定义注解实现日志记录

1.定义注解类




import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ ElementType.METHOD, ElementType.TYPE })  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface MethodLog {  
String remark() default "";  
    String operType() default "0";     
    String user() default "";
    //String desc() default "";  
}  



2.定义aop类




import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Calendar;


import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;


import com.cqliving.cloud.online.logs.MethodLog;
import com.cqliving.cloud.online.logs.dao.SysLogDao;
  

@Component  
@Aspect   
public class LogService {  
  
@Resource
private SysLogDao sysLogDao;
  
    public LogService() { 
    System.out.println("================login......");
    }  
  
  
    @Pointcut("@annotation(com.cqliving.cloud.online.logs.MethodLog)")  
    public void methodCachePointcut() {  
    System.out.println("===========aop切好啦。。。。。。。。");
    }  
  
    @SuppressWarnings("unused")
@Around("methodCachePointcut()")  
    public Object around(ProceedingJoinPoint point) throws Throwable {  
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder  
                .getRequestAttributes()).getRequest();  
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");  
        Calendar ca = Calendar.getInstance();  
        String operDate = df.format(ca.getTime());  
       // String ip =  
        
  
        String monthRemark = getMthodRemark(point);  
        String monthName = point.getSignature().getName();  
        String packages = point.getThis().getClass().getName();  
        System.out.println(monthRemark);
        if (packages.indexOf("$$EnhancerByCGLIB$$") > -1) { // 如果是CGLIB动态生成的类  
            try {  
                packages = packages.substring(0, packages.indexOf("$$"));  
            } catch (Exception ex) {  
                ex.printStackTrace();  
            }  
        }  
  
        String operatingcontent = "";  
        Object[] method_param = null;  
/*      Syslog sysLog = new Syslog();  
        sysLog.setIpAddress(ip);  
        sysLog.setLoginName(loginName);  
        sysLog.setName(name);
        sysLog.setMethodName("./" + monthName);  
        sysLog.setMethodRemark(monthRemark);          
        sysLog.setOperatingcontent(Arrays.toString(method_param));  
        sysLog.setOperatingSysName("KSFULIFE");*/




       
//       System.out.println("记录操作日志:"+sysLog);
       
//       systemLogDao.insert(sysLog);
    
        return method_param;  
}
    // 方法运行出现异常时调用    
    // @AfterThrowing(pointcut = "execution(* com.wssys.controller.*(..))",  
    // throwing = "ex")  
    public void afterThrowing(Exception ex) {  
        System.out.println("afterThrowing");  
        System.out.println(ex);  
    }  
  
    // 获取方法的中文备注____用于记录用户的操作日志描述  
    public static String getMthodRemark(ProceedingJoinPoint joinPoint)  
            throws Exception {  
        String targetName = joinPoint.getTarget().getClass().getName();  
        String methodName = joinPoint.getSignature().getName();  
        Object[] arguments = joinPoint.getArgs();  
  
        Class targetClass = Class.forName(targetName);  
        Method[] method = targetClass.getMethods();  
        String methode = "";  
        for (Method m : method) {  
            if (m.getName().equals(methodName)) {  
                Class[] tmpCs = m.getParameterTypes();  
                if (tmpCs.length == arguments.length) {  
                    MethodLog methodCache = m.getAnnotation(MethodLog.class);  
                    if (methodCache != null) {  
                        methode = methodCache.remark();  
                    }  
                    break;  
                }  
            }  
        }  
        return methode;  
    }  
  
  
}  



3.在controller层定义 加入注解


@RequestMapping(value="/agree/list",method={RequestMethod.GET,RequestMethod.POST})
@MethodLog(remark="查询")
    public String agree(HttpServletRequest request,HttpServletResponse resp,ModelMap map,@RequestParam(value="contentValue",required=false) String contentValue,@RequestParam(value="contentType",required=false) String contentType) throws UnsupportedEncodingException{

    }



4.在spring-servlet里加入


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


    <!-- aop -->
<bean id="logService" class="XXXX.LogService"></bean>
    

猜你喜欢

转载自blog.csdn.net/b452608/article/details/53340478