赞
踩
可以先看看生成的proxy对象实现了哪些接口,看看这些接口里是否有能获取原生Bean的方法:
在Advised接口发现了有一个getTargetSource():
有了TargetSource,就能获取到原生bean了,获取原生bean的方法就是TargetSource接口的getTarget方法:
测试一下,注入的bean是proxy对象:
下面把proxy对象转成Advised类型后再获取Target,可以发现成功获取到被代理的bean:
可以把proxy转Advised后获取被代理bean的这段逻辑封装到工具类当中。当然这个功能Spring已经有现成的了,直接用AopProxyUtils的getSingletonTarget方法就可以实现同样的功能:
AopProxyUtils的getSingletonTarget的实现逻辑和我们自己获取的实现逻辑差不多,都是把proxy转Advised后获取TargetSource再获取Target:
要注意的是AopProxyUtils的getSingletonTarget方法只能获取SingletonTargetSource类型的TargetSource的target,用@Aspect生成的Advisor的TargetSource的类型就是SingletonTargetSource,若是通过其它方式生成的Advisor,且使用的TargetSource不是SingletonTargetSource的话,就获取不到了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。