Spring aop学习示例


我这里只贴出来关键类和配置文件。

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死活注入不了,已测试验证解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值