SpringMVC 使用AOP添加日志

1 引入包

<dependency>
       <groupId>org.aspectj</groupId>
       <artifactId>aspectjweaver</artifactId>
       <version>1.8.10</version>
   </dependency> 

2 切面类:

package cn.tnt.aop.util;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
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.stereotype.Component;

@Component
@Aspect
public class LogAspect {
	private static final Logger log=LoggerFactory.getLogger(LogAspect.class);
	@Pointcut("execution(* cn.tnt.aop.service.*.*(..))")
	public void logPointCut(){
		
	}
	
	@Before(value="logPointCut()")
	public void logBefore(JoinPoint joinPoint){
		String targetName = joinPoint.getTarget().getClass().getName();
		String signatureName=joinPoint.getSignature().getName()+"()";
		String params=Arrays.toString(joinPoint.getArgs());
		log.info("------ METHOD BEFORE:"+targetName+"."+signatureName+"  params="+params);
	}
	
	@AfterReturning(value="logPointCut()",returning="res")
	public void logReturn(JoinPoint joinPoint,Object res){
		String targetName = joinPoint.getTarget().getClass().getName();
		String signatureName=joinPoint.getSignature().getName()+"()";
		String params=Arrays.toString(joinPoint.getArgs());
		log.info("------ METHOD RETURN:"+targetName+"."+signatureName+"  params="+params+"  response="+res);
	}
	
	@AfterThrowing(value = "logPointCut()", throwing = "e")
    public void logThrowing(JoinPoint joinPoint, Throwable e) {
		String targetName = joinPoint.getTarget().getClass().getName();
		String signatureName=joinPoint.getSignature().getName()+"()";
		String params=Arrays.toString(joinPoint.getArgs());
		log.info("------ METHOD ERROR:"+targetName+"."+signatureName+"  params="+params+"  exception="+e);
    }
}

3 扫描切面类所在的包并启动AaspectJ支持

    <context:component-scan base-package="cn.tnt.aop.*" />
    <!-- 启动AspectJ支持 -->
    <aop:aspectj-autoproxy proxy-target-class="true" />

经过上面3步,完成aspectj的应用。在调用service包下的任意类的方法时候会输出相应日志。

2018-10-30 14:06:11 INFO [cn.tnt.aop.util.LogAspect] ------ METHOD BEFORE:cn.tnt.aop.service.GoodsServiceImpl.query()  params=[2]
2018-10-30 14:06:11 INFO [cn.tnt.aop.service.GoodsServiceImpl] ##########2
2018-10-30 14:06:11 INFO [cn.tnt.aop.util.LogAspect] ------ METHOD RETURN:cn.tnt.aop.service.GoodsServiceImpl.query()  params=[2]  response={'goodsName':apple,'id':2}

完整代码:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cn.stu.tnt</groupId>
  <artifactId>tnt-service</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>tnt-service Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.1.2.RELEASE</version>
    </dependency>
   <dependency>
       <groupId>org.aspectj</groupId>
       <artifactId>aspectjweaver</artifactId>
       <version>1.8.10</version>
   </dependency> 
    
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
   <dependency>  
	    <groupId>org.slf4j</groupId>  
	    <artifactId>slf4j-log4j12</artifactId>  
	    <version>1.7.2</version>  
   </dependency>
  </dependencies>

  <build>
    <finalName>tnt-service</finalName>
  </build>
</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath*:/applicationContext.xml
		</param-value>
	</context-param>
 
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<servlet>
		<servlet-name>springServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
 
	<servlet-mapping>
		<servlet-name>springServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>

spring-mvc.xml

扫描二维码关注公众号,回复: 3809273 查看本文章
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
	<!-- 必须加上 -->
	<mvc:annotation-driven />

	<!-- 自动扫描且只扫描@Controller -->
	<context:component-scan base-package="cn.tnt.aop.controller">
	</context:component-scan>
 
	<!-- 视图 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
 
	<!-- 容器默认的DefaultServletHandler处理 所有静态内容与无RequestMapping处理的URL -->
	<mvc:default-servlet-handler />
</beans>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
		
	<context:component-scan base-package="cn.tnt.aop.*" />
	<!-- 启动AspectJ支持 -->
	<aop:aspectj-autoproxy proxy-target-class="true" />
	
</beans>

log4j.properties

log4j.rootLogger=info, stdout 

log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n 
log4j.appender.ServerDailyRollingFile.Append=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
log4j.appender.FILELOGER.encoding=UTF-8

log4j.logger.org.springframework = info

LogAspect

package cn.tnt.aop.util;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
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.stereotype.Component;

@Component
@Aspect
public class LogAspect {
	private static final Logger log=LoggerFactory.getLogger(LogAspect.class);
	@Pointcut("execution(* cn.tnt.aop.service.*.*(..))")
	public void logPointCut(){
		
	}
	
	@Before(value="logPointCut()")
	public void logBefore(JoinPoint joinPoint){
		String targetName = joinPoint.getTarget().getClass().getName();
		String signatureName=joinPoint.getSignature().getName()+"()";
		String params=Arrays.toString(joinPoint.getArgs());
		log.info("------ METHOD BEFORE:"+targetName+"."+signatureName+"  params="+params);
	}
	
	@AfterReturning(value="logPointCut()",returning="res")
	public void logReturn(JoinPoint joinPoint,Object res){
		String targetName = joinPoint.getTarget().getClass().getName();
		String signatureName=joinPoint.getSignature().getName()+"()";
		String params=Arrays.toString(joinPoint.getArgs());
		log.info("------ METHOD RETURN:"+targetName+"."+signatureName+"  params="+params+"  response="+res);
	}
	
	@AfterThrowing(value = "logPointCut()", throwing = "e")
    public void logThrowing(JoinPoint joinPoint, Throwable e) {
		String targetName = joinPoint.getTarget().getClass().getName();
		String signatureName=joinPoint.getSignature().getName()+"()";
		String params=Arrays.toString(joinPoint.getArgs());
		log.info("------ METHOD ERROR:"+targetName+"."+signatureName+"  params="+params+"  exception="+e);
    }
}

GoodsController

package cn.tnt.aop.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.tnt.aop.service.GoodsService;

@RestController
@RequestMapping("/goods")
public class GoodsController {
	@Autowired
	private GoodsService goodsService;
	
	@RequestMapping("/q")
	public String query(String id){
		return goodsService.query(id);
	}
}

GoodsService

package cn.tnt.aop.service;

public interface GoodsService {
	String query(String id);
}

GoodsServiceImpl

package cn.tnt.aop.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class GoodsServiceImpl implements GoodsService{
	private static final Logger log=LoggerFactory.getLogger(GoodsServiceImpl.class);
	@Override
	public String query(String id) {
		log.info("##########"+id);
//		throw new RuntimeException("test error");
		return "{'goodsName':apple,'id':"+id+"}";
	}

}

猜你喜欢

转载自blog.csdn.net/liangwenmail/article/details/83540818