zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    工作单元(UnitOfWork) 模式 (2) .NET Core
    工作单元(UnitOfWork) 模式 (1)
    WebAPI规范设计——违RESTful
    ASP.NET MVC / WebAPI 路由机制详解
    C#封装HttpClient工具类库(.NET4.5以上)
    centos7多网卡配置bond0 (mode6无需交换机做配置)
    linux windows 格式化一块大于2 TiB硬盘
    war包安装jenkins
    redis(一主两从三哨兵模式搭建)记录
    nginx + keepalived 主从模式
  • 原文地址:https://www.cnblogs.com/javaweb2/p/6768145.html
Copyright © 2011-2022 走看看