今天在做一个对Controller的AOP日志的这么一个操作,因为是分模块开发的(分成了DAO,Service,WEB,等等小模块),所以我是直接在WEB模块(就是Controller模块)中写了一个AOP日志通知类(日志代码在最下面),我采用的是注解的配置方式,但是配置完以后发现我的AOP日志压根就没有执行,然后才发现我没有在配置文件中打开对AOP注解的支持,改完以后再次运行发现还是没有执行。
想了一下,发现我配置AOP有问题。
注意:因为我是分模块开发的,我的AOP日志类是写在了Controller中,但是我第一次配置的AOP注解支持是在Service中的spring的配置文件(Application.xml文件),但是这个配置文件扫描的包只有Service下面的才能被扫描到。
唉,我人都傻了,我竟然犯了个这么低级的错误。
所以,在SpringMVC的配置文件中引入 对AOP的支持即可,即在SpringMVC的配置文件中先引入SpringAOP的xml约束,
再在SpringMVC的配置文件中开启AOP注解支持即可
附:对Controller中的方法、用户操作信息、进行日志监控的代码
//AOP日志信息处理类
public class AOPLog {
private Date beginTime; //开始执行的时间
private Class clazz; //执行的类
private Method method; //执行的方法
private String URL; //访问路径
@Autowired
private HttpServletRequest request;
@Resource(name = "sysLogService")
private SysLogService sysLogService;
//前置通知,获取执行的开始时间,执行的方法与类
@Before("execution(* top.zhengry.SM_WH.controller.*.*(..))")
public void AOPLogBefore(JoinPoint joinPoint) throws NoSuchMethodException {
beginTime = new Date(); //获取开始时间
clazz = joinPoint.getTarget().getClass(); //获取访问的类对象
Object[] args = joinPoint.getArgs(); //获取执行方法的参数列表
String methodName = joinPoint.getSignature().getName(); //获取执行的方法名
if (args == null || args.length ==0){
method = clazz.getMethod(methodName) ; //获取无参的方法对象
}else {
Class classArgs[] = new Class[args.length]; //把参数列表里的参数转为类对象
for (int i = 0; i < args.length; i++) {
classArgs[i] = args[i].getClass(); //获取参数列表的参数的类对象
}
method = clazz.getMethod(methodName, classArgs); //获取有参数的方法对象
}
}
//后置通知
@AfterReturning("execution(* top.zhengry.SM_WH.controller.*.*(..))")
public void AOPLogAfter() throws Exception {
//1、获取执行时长
Date endTime = new Date(); //执行结束的时间
//执行时长
Long excutionTime = endTime.getTime() - beginTime.getTime(); //访问的时长
//2、获取访问者的真实IP
//访问者的真实ip
String IP = GetRealIP.getIpAddress(request);
//3、获取访问的URL
if (clazz != null && clazz != AOPLog.class){
RequestMapping ClazzAnnotation = (RequestMapping)clazz.getAnnotation(RequestMapping.class);
if (ClazzAnnotation != null){
String ClazzPath = ClazzAnnotation.path()[0];
RequestMapping MethodAnnotation = method.getAnnotation(RequestMapping.class);
if (MethodAnnotation != null){
String MethodPath = MethodAnnotation.path()[0];
URL = ClazzPath + MethodPath;
}
}
}
//4、获取访问者的账户名称
SecurityContext context = SecurityContextHolder.getContext();
User user = (User)context.getAuthentication().getPrincipal();
//访问者的账户名称
String userName = user.getUsername();
//5、把信息封装到SysLog这个POJO类里
SysLog sysLog = new SysLog();
sysLog.setExecutionTime(excutionTime);
sysLog.setIp(IP);
sysLog.setUsername(userName);
sysLog.setUrl(URL);
sysLog.setMethod("[类名] "+clazz.getName()+"[方法名] "+method.getName());
sysLog.setVisitTime(beginTime);
System.out.println(sysLog);
sysLogService.saveSysLog(sysLog);
}
}