一、Aop术语
切面(Aspect):在Spring AOP中,切面可以使用通用类或者在普通类中以@Aspect 注解(@AspectJ风格)来实现
连接点(Joinpoint):在Spring AOP中一个连接点代表一个方法的执行
通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括"around"、"before”和"after"等通知。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链
切入点(Pointcut):定义出一个或一组方法,当执行这些方法时可产生通知,Spring缺省使用AspectJ切入点语法。
二、创建LoggerAspect类
@Aspect
public class loggerAspect {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Pointcut(value = "execution(* com.ly.dao.daoImpl.SysDaoImpl.*(..))")
public void pointCut() {
}
@AfterReturning(pointcut = "pointCut()", argNames = "joinPoint, retVal", returning = "retVal")
public void afterReturn(JoinPoint joinPoint, Object retVal) {
String className = joinPoint.getSignature().getName();
className = className.substring(className.lastIndexOf(".") + 1);
className = getMethodChineseName(className);
//日志记录连接点方法签名
log.info(className+":"+joinPoint.getSignature().toString());
//判断参数
if (null == joinPoint.getArgs()) {
log.info("没有参数!");
return;
}
StringBuilder rs = new StringBuilder();
for (Object arg : joinPoint.getArgs()) {
if (arg instanceof Object[]){
rs.append(Arrays.toString(((Object[]) arg))).append(", ");
}else {
rs.append(arg.toString()).append(", ");
}
}
String s = rs.toString().substring(0, rs.toString().length() - 2);
log.info("参数:[{}]", s);
}
/**
* 判断操作的中文名
*
* @param methodName
* @return
*/
public String getMethodChineseName(String methodName) {
if (methodName.endsWith("find")) {
return "查找数据";
}else {
return "";
}
}
}
三、配置AOP
在applicationContext.xml加上aop配置
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="loggerAspect" class="com.ly.aspect.loggerAspect" />
四、结果
日志记录如下: