说明:接上文,用户登录成功了,现在的需求是需要记录UserService类的方法被执行了多少次。如果设置一个全局变量,在每个方法里面去更改变量的值,显然是不太合理的。本文主要是为了解决这个问题,因此采用切面的编程。
一、修改jar包。
由于之前引入的jar包:aopalliance.jar 已经不能满足需求了,需要更换为更高版本的。这里采用1.6.12版本。如下图所示:
二、引入log4j.properties配置,他的作用是能够在控制台显示更多的日志内容。(这一步跟本应用没有直接关系,只是为了更好的使用而已)
1、编写log4j.properties配置文件,放置在WEB-INF目录下,内容如下:
log4j.rootLogger=WARN, Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=(%r ms) [%t] %-5p: %c#%M %x: %m%n
log4j.logger.com.genuitec.eclipse.sqlexplorer=DEBUG
log4j.logger.org.apache=WARN
log4j.logger.net.sf.hibernate=WARN
<!-- 以下3项参数与log4j的配置相关 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<!-- end -->
1、在service包下新建一个LogAspect文件,采用注记的形式。
package com.hzb.service;
import org.springframework.stereotype.Service;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.JoinPoint;
@Service
@Aspect
// 使用 @Aspect 标记
public class LogAspect {
//用来记录次数
private int count = 0;
//定义切点,表示UserService中所有的方法
@Pointcut("execution(* com.hzb.service.UserService.*(..))")
public void init(){
}
//定义增强,并应用在切点 init() 处,Before表示在方法执行前先执行下面的方法
@Before("init()")
public void beforeAdvice(JoinPoint joinPaint){
System.out.println("总共执行的次数:"+(++count));
//还可以获取其他的信息
//获取调用的目标类
Object obj = joinPaint.getTarget();
if(obj instanceof UserService){
UserService userService = (UserService)obj;
System.out.println("调用的目标类:"+userService.toString());
}
//获取调用的方法名
System.out.println("调用的方法名:"+joinPaint.getSignature().getName());
//获取传入的参数
Object[] args=joinPaint.getArgs();
for (int i = 0; i < args.length; i++) {
System.out.println("传入的参数"+i+";"+args[i]); //输出传入的参数
}
}
}
<!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 -->
<aop:aspectj-autoproxy/>
四、启动服务后登陆测试,查看后台输出的内容。