我这里只贴出来关键类和配置文件。
Aspect类
package com.nding.spring;
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
/**
* 已确认不加cglib-2.2.2.jar包可以执行成功
* 已确认不加@Component 注入不会生效
* @author li
*
*/
@Component // 单独Aspect不会生成bean
@Aspect
public class UserAspect {
/**
* 这种情况是引用切面
* 若方法com.nding.spring.UserManager.selectUser()没有注解@pointcut会报错error at ::0 can't find referenced pointcut selectUser
* @param jp
*/
//@Before("com.nding.spring.UserManager.selectUser()")
@Before(value = "execution(public * com.nding..*.*Manager.*(..))")
public void logger(JoinPoint jp){ // ProceedingJoinPoint只能用于around注入
Method method = ((MethodSignature)jp.getSignature()).getMethod();
System.out.println("aop inject, print method info:" + method.toString());
// // 仅处理public方法
// if (method.getModifiers() != Method.PUBLIC) {
// return;
// }
// Class<?>[] parameterTypes = method.getParameterTypes();
Object[] args = jp.getArgs();
// 参数名暂无法打印,考虑到编译时没带-g等,参数名为param1,没有实际意义
int len = args.length;
// if (len != args.length){
// logger.error("parameterTypes length: {}, args length: {}, both should be equal, but not", len, args.length);
// return;
// }
if (len ==0) return;
StringBuilder sb = new StringBuilder();
sb.append("request method: ").append(method.toString()).append(", param values: ");
for (int i=0; i<len; i++){
Object arg = args[i];
// if (arg instanceof javax.servlet.ServletRequest){
// sb.append(getReqScopeParams((ServletRequest)arg));
// }else {
sb.append(JSON.toJSON(arg));
// }
if (i != len-1){
sb.append(", ");
}
}
System.out.println(sb.toString());
}
}
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:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<context:component-scan base-package="com.nding.spring" />
<!-- <bean id="userAspect" class="com.nding.spring.UserAspect" />
<aop:config>
<aop:pointcut expression="execution(* com.nding.spring.UserManager.selectUser(..))" id="user" />
<aop:aspect ref="userAspect">
<aop:before method="logger" pointcut-ref="user" />
</aop:aspect>
</aop:config> -->
<aop:aspectj-autoproxy />
</beans>
工程下载路径:http://pan.baidu.com/s/1kUDtOP5
运行有问题的,可以留言。
Controller注入,要求*.dispatch.xml文件也要加入<aop:aspectj-autoproxy proxy-target-class="true"/>, 一定要添加proxy-target-class="true"
如果不添加,aop死活注入不了,已测试验证解决。