spring-aop深入

<!--我一般习惯把我所引用包的版本集中放在这里,这样比较直观-->  
  <properties>  
     <spring.version>4.1.3.RELEASE</spring.version>  
     <aspectj.version>1.6.11</aspectj.version>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  </properties>  
  
<!--测试包,自动生成-->  
  <dependencies>  
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>3.8.1</version>  
      <scope>test</scope>  
    </dependency>  
    <!--不用说,肯定是spring aop包-->  
      <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-aop</artifactId>  
            <version>${spring.version}</version>  
    </dependency>  
    <!--spring上下文包,在加载spring配置文件时用到-->  
      <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-context</artifactId>  
            <version>${spring.version}</version>  
    </dependency>  
    <!--使用AspectJ方式注解需要相应的包-->  
      <dependency>  
            <groupId>org.aspectj</groupId>  
            <artifactId>aspectjrt</artifactId>  
            <version>${aspectj.version}</version>  
        </dependency>  
         <!--使用AspectJ方式注解需要相应的包-->  
        <dependency>  
            <groupId>org.aspectj</groupId>  
            <artifactId>aspectjweaver</artifactId>  
            <version>${aspectj.version}</version>  
        </dependency>  
      
  </dependencies>  
package com.example.aop;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.example.annotation.LogInfo;
import com.example.config.BusinessException;
import com.example.config.Constants;
import com.example.config.HttpCode;
import com.example.config.ResultData;
import com.example.dao.vo.SysLog;
import com.example.service.SysLogService;
import com.google.gson.Gson;

/** 
 * @author  lilufeng 
 * @date 创建时间:2016年5月9日 下午1:01:47 
 */
@Component
@Aspect
public class ControllerAop {
    
    private static Logger logger = LoggerFactory.getLogger(ControllerAop.class);
    
    @Autowired
    SysLogService sysLogService;

    @Pointcut("execution(* com.example.controller..*.*(..))")
    public void init() {

    }
    
    @Before(value = "init()")
    public void before(JoinPoint jp) {
        //Object[] args = jp.getArgs();
        //logger.info("---------方法执行前执行.....");
    }

    @AfterReturning(value = "init()")
    public void afterReturning() {
        //logger.info("---------方法执行完执行.....");
    }

    @AfterThrowing(value = "init()")
    public void throwss() {
        //logger.info("--------方法异常时执行.....");
    }

    @After(value = "init()")
    public void after() {
        //logger.info("-------方法最后执行.....");
    }

    /**
     * 記錄日誌、全局異常處理
     * @param pjp
     * @return
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    @Around(value = "init()")
    public Object around(ProceedingJoinPoint pjp) throws Exception {
        boolean isLog = false;//是否記錄日誌
        boolean logException = false;//是否記錄異常日誌
        SysLog sysLog = new SysLog();
        LogInfo logInfo = null;
        Gson g = new Gson();
        Map<String, Object> map = new HashMap<String, Object>();
        Object[] params = pjp.getArgs();
        if(params.length > 0){
            for (int i = 0; i < params.length; i++) {
                map.put("params"+i, params[i]);
            }
        }
        String targetName = pjp.getTarget().getClass().getName();    
        String methodName = pjp.getSignature().getName();    
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        logger.info("-------【方法 " + targetName + "." + methodName + "() 执行开始】.....");
        Class targetClass = Class.forName(targetName);    
        Method[] methods = targetClass.getMethods(); 
        for (int i = 0; i < methods.length; i++) {
            if(methodName.equals(methods[i].getName())){
                logInfo = methods[i].getAnnotation(LogInfo.class);
                if(null != logInfo){
                    isLog = true;
                    logger.info("记录日志:" + logInfo.operationContent());
                    sysLog.setContent(logInfo.operationContent());
                    sysLog.setTypeKey(logInfo.logType().value());
                    sysLog.setTypeValue(logInfo.logType().name());
                    sysLog.setIp(request.getRemoteAddr());
                    sysLog.setParams(g.toJson(map));
                }
            }
        }
        Object o = null;
        try {
            o = pjp.proceed();
        } catch (Throwable e) {
            if(isLog){
                logException = true;
                logger.info("记录异常日志:" + e.getMessage());
                if (e instanceof BusinessException) {
                    sysLog.setFailureCause(e.getMessage());
                }else if(e instanceof IllegalArgumentException){
                    sysLog.setFailureCause(e.getMessage());
                }else{
                    sysLog.setFailureCause("服务器内部错误!");
                }
                sysLog.setResult("0");
            }
            exceptionHandler(response,e);
        }
        if(isLog){
            if(!logException){
                logger.info("记录成功日志:" + logInfo.operationContent() + "-----成功!");
                sysLog.setResult("1");
            }
            sysLog.setOperator(2);
            sysLogService.addSysLog(sysLog);
        }
        logger.info("-------【方法 " + targetName + "." + methodName + "() 执行结束】.....");
        return o;
    }
    
    /**
     * 全局异常处理
     * @param response
     * @param e
     * @throws Exception
     */
    public void exceptionHandler(HttpServletResponse response, Throwable e) throws Exception {
        logger.error(Constants.Exception_Head, e);
        ResultData resultData = new ResultData();
        if (e instanceof IllegalArgumentException) {
            if (StringUtils.isNotBlank(e.getMessage())) {
                resultData.setHttpCode(HttpCode.BAD_REQUEST.value());
                resultData.setMsg(e.getMessage());
            } else {
                resultData.setHttpCode(HttpCode.BAD_REQUEST.value());
                resultData.setMsg(HttpCode.BAD_REQUEST.msg());
            }
        } else if (e instanceof BusinessException) {
            if (StringUtils.isNotBlank(e.getMessage())) {
                resultData.setHttpCode(HttpCode.CONFLICT.value());
                resultData.setMsg(e.getMessage());
            } else {
                resultData.setHttpCode(HttpCode.CONFLICT.value());
                resultData.setMsg(HttpCode.CONFLICT.msg());
            }
        } else {
            resultData.setHttpCode(HttpCode.INTERNAL_SERVER_ERROR.value());
            resultData.setMsg(HttpCode.INTERNAL_SERVER_ERROR.msg());
        }
        response.setContentType("application/json;charset=UTF-8");
        Gson g = new Gson();
        byte[] bytes = g.toJson(resultData).getBytes();
        response.getOutputStream().write(bytes);
    }
}
原文地址:https://www.cnblogs.com/javaweb2/p/6768145.html