Spring AOP拦截Service实现日志管理(自定义注解的方式)
来源:互联网 发布:freebsd python pip 编辑:程序博客网 时间:2024/05/04 07:33
最近项目中用到AOP方式进行Service操作方法日志管理,特为之记!
1、先说理论和采用的方法
采用注解的方式,其中包括以下注解:@Aspect(类注解)和@AfterReturning(方法注解),其中需要用的Maven库如下:
"org.aspectj:aspectjrt:1.8.9","org.aspectj:aspectjweaver:1.8.9",
org.springframework spring-aop 4.0.5.RELEASE其中该两个注解的主要用法为:
@Aspect:Spring AOP支持的AspectJ切入点指示符
@AfterReturning:使用@AfterReturning可修饰AfterReturning增强处理,AfterReturning增强处理将在目标方法正常完成后被织入。
使用@AfterReturning注解可指定如下两个常用属性。
1) pointcut/value:这两个属性的作用是一样的,它们都属于指定切入点对应的切入表达式。一样既可以是已有的切入点,也可直接定义切入点表达式。当指定了pointcut属性值后,value属性值将会被覆盖。
2) returning:该属性指定一个形参名,用于表示Advice方法中可定义与此同名的形参,该形参可用于访问目标方法的返回值。除此之外,在Advice方法中定义该形参(代表目标方法的返回值)时指定的类型,会限制目标方法必须返回指定类型的值或没有返回值。
2、样例:
2.1 在spring-app-config.xml中声明启动aop
<!--配置aop自动创建代理--> <aop:aspectj-autoproxy proxy-target-class="true"/> <bean id="customerAspectLogger" class="com.XXX.dsppt.aop.CustomerAspectLogger"></bean> <bean id="systemAspectLogger" class="com.VVVV.dsppt.aop.SystemAspectLogger"></bean>
2.2 编写日志切面类
package com.XXX.dsppt.aop;import com.XXX.dsppt.entity.SystemLog;import com.XXX.dsppt.entity.User;import com.XXX.dsppt.entity.meta.SystemOperateType;import com.XXX.dsppt.security.SecurityConstants;import com.XXX.dsppt.service.ILogService;import org.apache.log4j.Logger;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.util.Date;/** * Created by nongdapeng on 17/5/4. */@Aspectpublic class SystemAspectLogger { private static final Logger logger = Logger.getLogger(SystemAspectLogger.class); @Resource private ILogService logService; /** * 创建日志 * @param point * @throws Throwable */ @AfterReturning(value = "execution (* com.XXX.dsppt.service.*.add*(..))", returning = "returnObj") public void endAddTransaction(JoinPoint point, Object returnObj) throws Throwable { //获取方法名 String methodName = point.getSignature().getName(); User user = getUser(); HttpServletRequest request = getRequest(); if (user != null) { SystemLog systemLog = new SystemLog(user,new Date(), SystemOperateType.ADD); logService.createSystemLog(systemLog); } } /** * 更新日志 * @param point * @throws Throwable */ @AfterReturning(value = "execution (* com.XXX.dsppt.service.*.update*(..))", returning = "returnObj") public void endUpdateTransaction(JoinPoint point, Object returnObj) throws Throwable { //获取方法名 String methodName = point.getSignature().getName(); User user = getUser(); HttpServletRequest request = getRequest(); if (user != null) { SystemLog systemLog = new SystemLog(user,new Date(), SystemOperateType.UPDATE); logService.createSystemLog(systemLog); } } /** * 删除日志 * @param point * @throws Throwable */ @AfterReturning(value = "execution (* com.XXX.dsppt.service.*.remove*(..))", returning = "returnObj") public void endRemoveTransaction(JoinPoint point, Object returnObj) throws Throwable { //获取方法名 String methodName = point.getSignature().getName(); User user = getUser(); HttpServletRequest request = getRequest(); if (user != null) { SystemLog systemLog = new SystemLog(user,new Date(), SystemOperateType.REMOVE); logService.createSystemLog(systemLog); } } /** * 导出日志 * @param point * @throws Throwable */ @AfterReturning(value = "execution (* com.XXX.dsppt.service.*.export*(..))", returning = "returnObj") public void endExportTransaction(JoinPoint point, Object returnObj) throws Throwable { //获取方法名 String methodName = point.getSignature().getName(); User user = getUser(); HttpServletRequest request = getRequest(); if (user != null) { SystemLog systemLog = new SystemLog(user,new Date(), SystemOperateType.EXPORT); logService.createSystemLog(systemLog); } } private User getUser() { User user = null; try { ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpSession session = attr.getRequest().getSession(true); user = (User) session.getAttribute(SecurityConstants.LOGIN_SESSION); } catch (Exception ignored) { ignored.printStackTrace(); logger.error("获取当前登陆用户时发生错误:" + ignored.getMessage()); } return user; } private HttpServletRequest getRequest() { HttpServletRequest request = null; try { ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); request = attr.getRequest(); } catch (Exception ignored) { ignored.printStackTrace(); logger.error("获取当前用户ip错误:" + ignored.getMessage()); } return request; }}
其中,一些相关概念:Aspect - 切面
Pointcut - 切入点
Joinpoint - 连接点
Pointcut Designators (PCD)
Spring AOP中, 切入点(Pointcut)注释符在使用execution方法时以下的连接点(joinpoint)是可用的。
• execution
• within
• this
• target
• args
• @target
• @args
• @within
• @annotation
• bean
以下的切入点(pointcut)仅支持基于XML的Spring AOP配置,不支持AspectJ注释形式。如使用将会导致IllegalArgumentException异常。他们是:
• call
• get
• set
• preinitialization
• staticinitialization
• initialization
• handler
• adviceexecution
• withincode
• cflow
• cflowbelow
• if
• @this
• @withincode
0 0
- Spring AOP拦截Service实现日志管理(自定义注解的方式)
- aop:aspectj-autoproxy, SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- Spring Aop自定义注解拦截Controller实现日志管理
- Spring MVC AOP通过自定义注解方式拦截Controller等实现日志管理
- Spring AOP 自定义注解方式实现实现日志管理
- spring AOP自定义注解方式实现日志管理
- spring AOP自定义注解方式实现日志管理
- spring AOP自定义注解方式实现日志管理 详解
- spring AOP自定义注解方式实现日志管理
- spring AOP自定义注解方式实现日志管理
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- Android通知栏,setLatestEventInfo方法过时问题
- 从亏损到盈利,竟然迈出了这样不同的一步
- Properties配置文件
- Codeforces Round #411 (Div. 2)E. Ice cream coloring
- Programming Contest Ranking(题解)
- Spring AOP拦截Service实现日志管理(自定义注解的方式)
- Java8新特性之Lambda表达式(1)
- 双向循环链表-DoubleList
- Codeforces Round #363 (Div. 2) B. One Bomb —— 技巧
- VPS + ShadowSocks 访问一些网站
- gcc与g++比较
- 刷leetcode过程中记录难度题,自己做法及最优做法
- Supermap-打开数据源失败
- dao模式总结