最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springMVC自定義注解,用AOP來實現(xiàn)日志記錄的方法

 更新時間:2018年01月22日 14:32:48   作者:沒有桃子的阿貍  
下面小編就為大家分享一篇springMVC自定義注解,用AOP來實現(xiàn)日志記錄的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

需求背景

最近的一個項目,在項目基本完工的階段,客戶提出要將所有業(yè)務(wù)操作的日志記錄到數(shù)據(jù)庫中,并且要提取一些業(yè)務(wù)的關(guān)鍵信息(比如交易單號)體現(xiàn)在日志中。

為了保證工期,在查閱了資料以后,決定用AOP+自定義注解的方式來完成這個需求。

準(zhǔn)備工作

自定義注解需要依賴的jar包有 aspectjrt-XXX.jar ,aspectjweaver-XXX.jar,XXX代表版本號。

自定義注解

在項目下單獨建立了一個log包,來存放日志相關(guān)的內(nèi)容

**.common.log.annotation //自定義注解存放位置
**.common.log.aop     //aop工具類存放位置

在annotation包下面新建自定義注解類:

package **.common.log.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface XXXOperateLog {
  /**
   * 操作類型描述
   * @return
   */
  String operateTypeDesc() default "";
  /**
   * 操作類型
   * @return
   */
  long operateType() default -1;
  /**
   * 模塊編碼
   * @return
   */
  String moudleCode() default "M30";
  /**
   * 模塊名稱
   * @return
   */
  String moudleName() default "XX模塊";
  /**
   * 業(yè)務(wù)類型
   * @return
   */
  String bussType() default "";
  /**
   * 業(yè)務(wù)類型描述
   * @return
   */
  String bussTypeDesc() default "";
}

在aop包下新建XXXOperateLogAop

package **.common.log.aop;
import ** ;//省略
@Aspect
@Component
public class XXXOperateLogAop{
  @Autowired
  SystemLogService systemLogService;
   HttpServletRequest request = null;
   Logger logger = LoggerFactory.getLogger(XXXOperateLogAop.class);
  ThreadLocal<Long> time = new ThreadLocal<Long>();
  //用于生成操作日志的唯一標(biāo)識,用于業(yè)務(wù)流程審計日志調(diào)用
  public static ThreadLocal<String> tag = new ThreadLocal<String>();
  //聲明AOP切入點,凡是使用了XXXOperateLog的方法均被攔截
  @Pointcut("@annotation(**.common.log.annotation.XXXOperateLog)")
  public void log() {
    System.out.println("我是一個切入點");
  }
  /**
   * 在所有標(biāo)注@Log的地方切入
   * @param joinPoint
   */
  @Before("log()")
  public void beforeExec(JoinPoint joinPoint) {
    time.set(System.currentTimeMillis());  
    info(joinPoint);
    //設(shè)置日志記錄的唯一標(biāo)識號
    tag.set(UUID.randomUUID().toString());
    request= ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  }
  @After("log()")
  public void afterExec(JoinPoint joinPoint) {
    MethodSignature ms = (MethodSignature) joinPoint.getSignature();
    Method method = ms.getMethod();
    logger.debug("標(biāo)記為" + tag.get() + "的方法" + method.getName()
        + "運行消耗" + (System.currentTimeMillis() - time.get()) + "ms");  
  }
  //在執(zhí)行目標(biāo)方法的過程中,會執(zhí)行這個方法,可以在這里實現(xiàn)日志的記錄
  @Around("log()")
  public Object aroundExec(ProceedingJoinPoint pjp) throws Throwable {
    Object ret = pjp.proceed();
    try {
      Object[] orgs = pjp.getArgs();
      SystemLog valueReturn = null;
      for (int i = 0; i < orgs.length; i++) {
        if(orgs[i] instanceof SystemLog){
          valueReturn = (SystemLog) orgs[i];
        }  
      }  
      if(valueReturn==null){
        valueReturn = new SystemLog();
      }
      if(valueReturn!=null&&request!=null){
        MethodSignature ms = (MethodSignature) pjp.getSignature();
        Method method = ms.getMethod();
        //獲取注解的操作日志信息
        XXXOperateLog log = method.getAnnotation(XXXOperateLog.class);
        String businessType = log.bussType();
        String businessDesc = log.bussTypeDesc();
        HashMap requestMap = ServletUtils.getParametersToHashMap(request) ;
        //從參數(shù)中尋找業(yè)務(wù)類型
        if(businessType.equals(""))
        {
          Object objBusinessType = requestMap.get("business_type");
          businessType = objBusinessType == null ? "" : objBusinessType.toString();
        }
        //從執(zhí)行結(jié)果的申請單中找業(yè)務(wù)類型
        Object apply = request.getAttribute("apply") ;
        if(apply != null){
          JSONObject obj = JSONFactory.toJSONAbstractEntity(apply);
          if(obj != null)
          {
            valueReturn.setOtherDesc("申請單號:"+obj.getString("apply_no"));
            if(businessType.equals(""))
            {
              businessType = obj.getString("business_type");
            }
          }
        }
        //從方法的執(zhí)行過程參數(shù)中找業(yè)務(wù)類型(一般是手動設(shè)置)
        if(businessType.equals(""))
        {
          businessType = (String) request.getAttribute("business_type");
          businessType = businessType == null ? "" : businessType;
        }
        if(!businessType.equals("") && businessDesc.equals(""))
        {
          businessDesc = XXXSysConstant.BUSINESS_TYPE.getName(businessType);
        }
        valueReturn.setBussType(XXXSysConstant.BUSINESS_TYPE.getNumber(businessType));
        valueReturn.setBussTypeDesc(businessDesc);
        valueReturn.setMoudleCode(log.moudleCode());
        valueReturn.setMoudleName(log.moudleName());
        valueReturn.setOperateResult(XXXSysConstant.YesOrNo.YES);
        valueReturn.setOperateType(log.operateType());
        valueReturn.setInputUserId(((UserContext)WebUtils.getSessionAttribute(request, "XXXuserContext")).getSysUser().getId());
        valueReturn.setOperateTypeDesc(log.operateTypeDesc());
        valueReturn.setRequestIp(getRemoteHost(request));
        valueReturn.setRequestUrl(request.getRequestURI());
        valueReturn.setServerIp(request.getLocalAddr());
        valueReturn.setUids(tag.get());
        //保存操作日志
        systemLogService.saveSystemLog(valueReturn);
      }else{
        logger.info("不記錄日志信息");
      }
      //保存操作結(jié)果  
    } catch (Exception e) {
      e.printStackTrace();
    }
    return ret;
  }
  //記錄異常日志
  @AfterThrowing(pointcut = "log()",throwing="e")
  public void doAfterThrowing(JoinPoint joinPoint, Throwable e) {
    try {
      info(joinPoint);
      Object[] orgs = joinPoint.getArgs();
      SystemLog valueReturn = null;
      for (int i = 0; i < orgs.length; i++) {
        if(orgs[i] instanceof SystemLog){
          valueReturn = (SystemLog) orgs[i];
        }      
      }
      if(valueReturn==null){
        valueReturn = new SystemLog();
      }
      if(valueReturn!=null&&request!=null){
        MethodSignature ms = (MethodSignature) joinPoint.getSignature();
        Method method = ms.getMethod();
        XXXOperateLog log = method.getAnnotation(XXXOperateLog.class);
        String businessType = log.bussType();
        String businessDesc = log.bussTypeDesc();
        if(businessType.equals(""))
        {
          Object objBusinessType = ServletUtils.getParametersToHashMap(request).get("business_type");
          businessType = objBusinessType == null ? "" : objBusinessType.toString();
          businessDesc = XXXSysConstant.BUSINESS_TYPE.getName(businessType);
        }
        valueReturn.setBussType(XXXSysConstant.BUSINESS_TYPE.getNumber(businessType));
        valueReturn.setBussTypeDesc(businessDesc);
        valueReturn.setMoudleCode(log.moudleCode());
        valueReturn.setMoudleName(log.moudleName());
        valueReturn.setOperateType(log.operateType());
        valueReturn.setOperateTypeDesc(log.operateTypeDesc());
        valueReturn.setInputUserId(((UserContext)WebUtils.getSessionAttribute(request, "XXXuserContext")).getSysUser().getId());
        valueReturn.setOperateResult(XXXSysConstant.YesOrNo.NO);
        String errMes = e.getMessage();
        if(errMes!=null && errMes.length()>800){
          errMes = errMes.substring(0, 800);
        }
        valueReturn.setErrorMessage(errMes);
        valueReturn.setRequestIp(getRemoteHost(request));
        valueReturn.setRequestUrl(request.getRequestURI());
        valueReturn.setServerIp(request.getLocalAddr());
        valueReturn.setUids(tag.get());
        systemLogService.saveSystemLog(valueReturn);
      }else{
        logger.info("不記錄日志信息");
      }
    } catch (Exception e1) {
      e1.printStackTrace();
    }
  }
  private void info(JoinPoint joinPoint) {
    logger.debug("--------------------------------------------------");
    logger.debug("King:\t" + joinPoint.getKind());
    logger.debug("Target:\t" + joinPoint.getTarget().toString());
    Object[] os = joinPoint.getArgs();
    logger.debug("Args:");
    for (int i = 0; i < os.length; i++) {
      logger.debug("\t==>參數(shù)[" + i + "]:\t" + os[i].toString());
    }
    logger.debug("Signature:\t" + joinPoint.getSignature());
    logger.debug("SourceLocation:\t" + joinPoint.getSourceLocation());
    logger.debug("StaticPart:\t" + joinPoint.getStaticPart());
    logger.debug("--------------------------------------------------");
  }
  /**
   * 獲取遠(yuǎn)程客戶端Ip
   * @param request
   * @return
   */
  private String getRemoteHost(javax.servlet.http.HttpServletRequest request){
    String ip = request.getHeader("x-forwarded-for");
    if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
      ip = request.getHeader("Proxy-Client-IP");
    }
    if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
      ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
      ip = request.getRemoteAddr();
    }
    return ip.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip;
  }  
}

修改配置文件spring-mvc.xml,添加如下配置

  <!-- 開啟AOP攔截 -->
  <aop:aspectj-autoproxy proxy-target-class="true" /> 
  <mvc:annotation-driven />
  <!-- 定義Spring描述Bean的范圍 -->
  <context:component-scan base-package="**.common.log" >
     <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  </context:component-scan>

需要注意的是,上述配置必須放在同一個xml文件里面,要么spring-mvc.xml,要么spring-context.xml,否則可能不生效,暫時還未查明是為什么。

注解的使用

@XXXOperateLog(
      bussType=XXXSysConstant.BUSINESS_TYPE.YYYY
      ,bussTypeDesc="業(yè)務(wù)類型描述"
      ,operateType = XXXSysConstant.LogOperateType.QUERY
      ,operateTypeDesc = "操作描述"
  )
  @RequestMapping(value = "/**/**/queryXXXXX4DataGrid.json", method = RequestMethod.POST)
  public void queryXXXXX4DataGrid(HttpServletRequest request, HttpServletResponse arg1, Model model, Writer writer)
  {
    logger.info("==========驗票查詢(出庫)交易信息 開始=====================");
    try {
      //do something for business
    } catch (SystemException se) {
      throw se;
    } catch (BusinessException be) {
      throw be;
    } catch (Exception e) {
      throw new SystemException(e);
    }
  }

以上這篇springMVC自定義注解,用AOP來實現(xiàn)日志記錄的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用java實現(xiàn)日志工具類分享

    使用java實現(xiàn)日志工具類分享

    這篇文章主要介紹的Java代碼工具類是用于書寫日志信息到指定的文件,并且具有刪除之前日志文件的功能,需要的朋友可以參考下
    2014-03-03
  • Java SiteMesh新手學(xué)習(xí)教程代碼案例

    Java SiteMesh新手學(xué)習(xí)教程代碼案例

    這篇文章主要介紹了Java SiteMesh新手學(xué)習(xí)教程代碼案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Java利用Redis實現(xiàn)高并發(fā)計數(shù)器的示例代碼

    Java利用Redis實現(xiàn)高并發(fā)計數(shù)器的示例代碼

    這篇文章主要介紹了Java利用Redis實現(xiàn)高并發(fā)計數(shù)器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • MyBatis在insert插入操作時返回主鍵ID的配置(推薦)

    MyBatis在insert插入操作時返回主鍵ID的配置(推薦)

    這篇文章主要介紹了MyBatis在insert插入操作時返回主鍵ID的配置的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • 劍指Offer之Java算法習(xí)題精講二叉樹專題篇下

    劍指Offer之Java算法習(xí)題精講二叉樹專題篇下

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • Java縮略圖生成庫之Thumbnailator應(yīng)用說明

    Java縮略圖生成庫之Thumbnailator應(yīng)用說明

    Thumbnailator是一個為Java界面更流暢的縮略圖生成庫,從API提供現(xiàn)有的圖像文件和圖像對象的縮略圖中簡化了縮略過程,兩三行代碼就能夠從現(xiàn)有圖片生成縮略圖,使用起來非常方便,需要的朋友可以了解下
    2012-12-12
  • Mybatis如何分割字符串

    Mybatis如何分割字符串

    這篇文章主要介紹了Mybatis如何分割字符串問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java設(shè)計模式之責(zé)任鏈模式詳解

    Java設(shè)計模式之責(zé)任鏈模式詳解

    這篇文章主要介紹了Java設(shè)計模式之責(zé)任鏈模式詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • springboot中使用rabbitt的詳細(xì)方法

    springboot中使用rabbitt的詳細(xì)方法

    這篇文章主要介紹了springboot中使用rabbitt,通過本文學(xué)習(xí)讓我們了解如何在Spring Boot中使用RabbitMQ,并使用不同的交換機和隊列類型以及消息確認(rèn)模式,需要的朋友可以參考下
    2023-05-05
  • jar包和war包區(qū)別解析

    jar包和war包區(qū)別解析

    jar是java普通項目打包,通常是開發(fā)時要引用通用類,打成jar包便于存放管理,war是java web項目打包,web網(wǎng)站完成后,打成war包部署到服務(wù)器,目的是為了節(jié)省資源,提供效率,這篇文章主要介紹了jar包和war包區(qū)別及理解,需要的朋友可以參考下
    2023-07-07

最新評論

兰溪市| 炎陵县| 泾源县| 兰坪| 调兵山市| 大城县| 泾源县| 江安县| 临高县| 广水市| 巴塘县| 醴陵市| 应用必备| 商洛市| 界首市| 菏泽市| 东乌| 韩城市| 呼玛县| 忻城县| 迁西县| 漳浦县| 来宾市| 酉阳| 敦化市| 石渠县| 石河子市| 岱山县| 乳山市| 搜索| 松阳县| 镇巴县| 彭阳县| 临城县| 吉首市| 西宁市| 山阳县| 南郑县| 武隆县| 米易县| 渑池县|