api分层内部外部 spring_spring基于cglib实现aop时是否可以支持一个对象内部方法间的嵌套代理...

问答哪里没有人理,放在这里试试吧。。。

悬赏:5 发布时间:2008-12-31 提问人:jef (初级程序员)

网上的资料总是说spring的aop功能不支持对象内部方法间的嵌套代理。

不过今天试了一下,在不使用spring框架的时候,直接调用cglib的api,是可以实现一个对象内部方法间的嵌套代理的。

那么。。。为什么总说spring不支持一个实例方法间的嵌套代理呢。

如果强制spring使用cglib后可以实现嵌套代理,那么spring又是如何避免一个server内部方法间的事务的嵌套呢。

有点疑惑。。。望指点。。。:)

问题补充:

感谢netfork的关注,贴出cglib的测试代码,测试代码改自论坛中另外一个介绍cglib使用的帖子。

1)被代理类findInfo方法调用findInfo2方法

package x.y.aop.cglib;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class StudentInfoServiceImpl {

protected final Log logger = LogFactory.getLog(getClass());

public void findInfo(String name){

logger.info("你目前输入的名字是:"+name);

//StudentInfoServiceImpl类内部调用!

findInfo2();

logger.info("complete method findInfo");

}

public void findInfo2(){

logger.info("i'm in findinfo2!!!");

}

}

2)cglib拦截类

package x.y.aop.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;

import net.sf.cglib.proxy.MethodInterceptor;

import net.sf.cglib.proxy.MethodProxy;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class AOPInstrumenter implements MethodInterceptor {

protected final Log logger = LogFactory.getLog(getClass());

private Enhancer enhancer = new Enhancer();

public Object getInstrumentedClass(Class clz) {

enhancer.setSuperclass(clz);

enhancer.setCallback(this);

return enhancer.create();

}

public Object intercept(Object o, Method method, Object[] args,

MethodProxy proxy) throws Throwable {

logger.info("进入代理 方法:" + method.getName());

logger.info("开始执行原始方法:" + method.getName());

Object result = proxy.invokeSuper(o, args);

logger.info("退出代理 方法:" + method.getName());

return result;

}

}

3)main方法

package x.y.aop.cglib;

public class main {

public static void main(String[] args) {

AOPInstrumenter instrumenter = new AOPInstrumenter();

StudentInfoServiceImpl studentInfo = (StudentInfoServiceImpl)instrumenter.getInstrumentedClass(StudentInfoServiceImpl.class);

studentInfo.findInfo("阿飞");

}

}

4)log日志输入

main - 进入代理 方法:findInfo

main - 开始执行原始方法:findInfo

main - 你目前输入的名字是:阿飞

main - 进入代理 方法:findInfo2

main - 开始执行原始方法:findInfo2

main - i'm in findinfo2!!!

main - 退出代理 方法:findInfo2

main - complete method findInfo

main - 退出代理 方法:findInfo

这个测试可以说明cglib能实现同一对象方法级的嵌套拦截了吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值