Spring aop 记录操作日志 Aspect 自定义注解
时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题
所需jar包 :spring4.3相关联以及aspectjweaver-1.8.5.jar,jdk 1.7,1.8亲测可用,源码下载链接放在最后,关键代码如下:
1.Action
package com.opr.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.opr.service.UserService; @Controller @RequestMapping("user") public class UserController { @Autowired UserService userService; /*** * 首页 * @param request * @param response * @return ModelAndView */ @RequestMapping("index") public ModelAndView index(HttpServletRequest request,HttpServletResponse response) { return new ModelAndView("index"); } /*** * 登录 * @param request * @param response * @return ModelAndView */ @RequestMapping("userLogin") public ModelAndView userLogin(HttpServletRequest request,HttpServletResponse response, String userName,String password) { ModelAndView mv = new ModelAndView(); try { boolean result = userService.userLogin(userName,password); if(result) { mv.setViewName("success"); }else { mv.setViewName("error"); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return mv; } }
2.Service
package com.opr.service.impl; import org.springframework.stereotype.Service; import com.opr.annotation.OperLog; import com.opr.service.UserService; @Service("userService") public class UserServiceImpl implements UserService { //设置默认值,模拟登录 private final String userName = "admin"; private final String password = "123456"; @Override @OperLog(operType="用户登录",userIndex = 0 )//0为下标,代表传入的第一个参数,这里取userName为示例。实际场景可以在session中取操作人! public boolean userLogin(String userName,String password) { boolean flag = false; if(this.userName.equals(userName) && this.password.equals(password)) { flag = true; } return flag; } }
3.自定义注解
package com.opr.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //这里不明白的童鞋可以抽空看看自定义注解 @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface OperLog { //操作类型 String operType() default ""; //操作人 String user() default ""; //操作人下标 int userIndex() default -1; }
4.拦截器
package com.opr.interceptor; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import com.opr.annotation.OperLog; @Aspect @Component public class OperLogInterceptor { //这里写的为环绕触发 ,可自行根据业务场景选择@Before @After //触发条件为:com.opr包下面所有类且注解为OperLog的 @Around("within(com.opr..*) && @annotation(operLog)") public Object doAroundMethod(ProceedingJoinPoint pjd,OperLog operLog) throws Throwable { long startTime=System.currentTimeMillis();//开始时间 Object[] params = pjd.getArgs();//获取请求参数 System.out.println("监听到传入参数为:"); for(Object param:params) { System.out.println(param); } //###################上面代码为方法执行前##################### Object result = pjd.proceed();//执行方法,获取返回参数 //###################下面代码为方法执行后##################### System.out.println("返回参数为:" + result); String user = operLog.userIndex()==-1?operLog.user():(String)params[operLog.userIndex()];//操作人 String operType = operLog.operType();//操作类型 System.out.println("操作人: " + user +" 操作类型: " + operType); long endTime=System.currentTimeMillis();//结束时间 float excTime=(float)(endTime-startTime)/1000; System.out.println("执行时间:"+excTime+"s"); System.out.println("#######################分隔符##########################"); return result; } }
5.Spring
<?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/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <!-- 设置扫描目录 --> <context:component-scan base-package="com.opr" /> <!-- 设置请求映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!-- 设置适配器处理器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!-- 设置视图处理器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp" /> </bean> <aop:aspectj-autoproxy proxy-target-class="true" /> </beans>
6.运行项目后
7.成功
1).前端效果:
2).后台打印:
8.失败
1).前端效果:
2).后台打印:
源码下载地址:http://download.csdn.net/download/qq_16437937/10188600
吐槽一下:CSDN下载最低为2分,分不够的可以邮箱@我,或者在下面留下你的邮箱,我看到了就会发你
邮箱为:Leifeiwangyi@163.com
有什么问题可以留言咱们讨论讨论,谢谢大家