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+"}";
}
}