<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

記錄使用AspectJ打印日志(SpringMVC項目)

記錄使用AspectJ打印日志(SpringMVC項目)

前言

最近公司組織出題考試。小伙伴出題,然后我參與了一波。發現兩個問題。
1、太久沒用aop,發現切面寫的沒問題,但是日志不打印。
2、現在大家都用springboot,而我依然習慣用springmvc,這樣一來,項目就比小伙伴們大了不知道多少,雖然我的框架是新搭建的空項目。

正文

1. 考題大意如下

找到下圖標紅controller其下面的所有包下類中的insert,update,delete開頭的方法打印日志。
在這里插入圖片描述

打印日志格式如下:
=請求內容=
請求地址:http://192.168.1.246:8080/insertUser
請求方式:POST
請求類方法:ResultEntity com.crcb.controller.LoginController.insertUser(UserEntity)
請求參數:user,{“password”:“2”,“username”:“1”}
請求CLASS_METHOD : com.crcb.controller.LoginController.insertUser
=請求內容=
--------------返回內容----------------
Response內容:{“data”:“用手機登錄成功”,“retcode”:200,“retdesc”:“成功”}
--------------返回內容----------------

2. 解題如下:

1. SpringMVC項目集成AspectJ

1.1. 依賴文件

<!-- begin AspectJ -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>${org.aspectj-version}</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>${org.aspectj-version}</version>
    </dependency>
    <!-- end AspectJ -->

1.2 配置文件
在springmvc的容器配置文件中加入以下兩行代碼:

<aop:aspectj-autoproxy proxy-target-class="true"/>
    <bean id="LogAspect" class="com.crcb.aop.LogAspect"></bean>

切記一定是springMvc容器的配置文件中開啟aop,并注入日志對象。假如在spring容器的配置文件中加入會導致切面不生效!例如,我就有兩個容器的配置文件如下圖:一定要選springmvc-servlet.xml中配置。見前言、問題1。
在這里插入圖片描述
1.3 附web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/conf/applicationContext.xml</param-value>
  </context-param>
  <!-- 配置Spring2:配置Spring監聽2 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 創建分發Servlet -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:conf/springmvc-servlet.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

1.4 核心代碼如下:
主要是切點表達式的使用

@Aspect
public class LogAspect {


    @Pointcut("execution(public * com.crcb.controller..insert*(..))")
    private void insert(){}

    @Pointcut("execution(public * com.crcb.controller..update*(..))")
    private void update(){}

    @Pointcut("execution(public * com.crcb.controller..delete*(..))")
    private void delete(){}

    //定義環繞通知:處理日志注入
    @Around("insert()||update()||delete()")
    private Object logAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object[] args = proceedingJoinPoint.getArgs();
        System.out.println("===============請求內容===============");
        String requestStr = JSONObject.toJSONString(args);
        System.out.println("請求類方法:"+proceedingJoinPoint.getSignature().toString());
        System.out.println("請求參數:user,"+requestStr);
        System.out.println("請求CLASS_METHOD:"+proceedingJoinPoint.getTarget().getClass().getName());
        System.out.println("===============請求內容===============");
        System.out.println("--------------返回內容----------------");
        Object result = proceedingJoinPoint.proceed();
        System.out.println("Response內容:" + JSONObject.toJSONString(result));
        System.out.println("--------------返回內容----------------");
        return result;
    }
}

1.5 源碼地址,歡迎下載。

相關推薦
??2020 CSDN 皮膚主題: 編程工作室 設計師:CSDN官方博客 返回首頁
彩票送彩金