使用spring的动态代理功能时为什么必须指定要代理的目标类的接口?

单骑2009 2009-12-14 06:26:49
可能我钻牛角尖了不过我还是想知道,望大家指点
spring中配置代理的一般方法:

<bean id="sysUserDaoWithAOP" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.trs.wxcm.dao.IBaseDao</value>
</property>
<property name="target">
<ref local="sysUserDao"/>
</property>
<property name="interceptorNames">
<list>
<value>logInterceptor</value>
</list>
</property>
</bean>

注意这里:

<property name="proxyInterfaces">
<value>com.trs.wxcm.dao.IBaseDao</value>
</property>

指定要代理的类所实现的接口。
我一直不明白的是使用动态代理的时候,下面明明已经指定了要代理的对象“sysUserDao”,为什么上面还要多此一举必须指定这个对象所实现的接口呢?
这样做导致我必须为不想写接口但又想使用spring动态代理功能的类去写一个接口……,
后来在《spring技术手册》这本书上看到,spring动态代理功能的实现是基于java的动态代理机制,好吧我们再来看java的动态代理机制:
主要的原理是使用Proxy.newProxyInstance()方法创建一个代理对象来代理指定的类,查阅JDK文档这个方法有三个参数:
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
第一个参数为要代理的类,第二个参数为这个类的接口(。。),第三个暂且不管。
哦这下明白了,原来java实现动态代理的时候要求必须有接口类,导致spring也这么向我们要求了。

但是问题又来了,java干嘛非要这个接口呢?

难道是为了规范和安全需要?

疑惑不解啊,求解答
...全文
433 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaopeng0072008 2010-04-25
  • 打赏
  • 举报
回复
看看源代码就可以知道了
panhaichun 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wowtianwen 的回复:]
引用 2 楼 javaalpha 的回复:

即这个代理类适用于任何接口的实现



明白了,这样做的话,这个代理类就可以代理这个接口的所有实现,而不用为每一个接口的实现类都配置一个代理类。

虽然有点麻烦不过当有多个这个接口的实现类要代理的时候就简单了,可以这么理解吧?
[/Quote]

如果你还有个sysUserDao2类也实现了IBaseDao接口的话,要想对它进行代理还是得再配置一个代理类。



楼主的问题其实是:为什么Proxy.newProxyInstance方法中的第二个参数是接口数组而不是目标实现类
这个你去看java.lang.reflect.Proxy的源代码。不过最关键的生成ProxyClass的那个类看不到

另外Proxy.newProxyInstance第一个参数是目标类的classLoader
LLL710451618 2009-12-14
  • 打赏
  • 举报
回复
hao hao
单骑2009 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 landor2004 的回复:]
如果用的是jdk动态代理,那么需要实现接口
如果用cglib代理,不需要实现接口

具体请参见spring参考手册
[/Quote]

这个我知道,我只是不明白,使用动态代理时为什么要实现接口
Landor2004 2009-12-14
  • 打赏
  • 举报
回复
如果用的是jdk动态代理,那么需要实现接口
如果用cglib代理,不需要实现接口

具体请参见spring参考手册
godismydaughter 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wowtianwen 的回复:]
引用 2 楼 javaalpha 的回复:

即这个代理类适用于任何接口的实现



明白了,这样做的话,这个代理类就可以代理这个接口的所有实现,而不用为每一个接口的实现类都配置一个代理类。

虽然有点麻烦不过当有多个这个接口的实现类要代理的时候就简单了,可以这么理解吧?
[/Quote]同意。
单骑2009 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 javaalpha 的回复:]

即这个代理类适用于任何接口的实现

[/Quote]

明白了,这样做的话,这个代理类就可以代理这个接口的所有实现,而不用为每一个接口的实现类都配置一个代理类。

虽然有点麻烦不过当有多个这个接口的实现类要代理的时候就简单了,可以这么理解吧?
  • 打赏
  • 举报
回复
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  • 打赏
  • 举报
回复
gfg啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

gs
alpha 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 javaalpha 的回复:]
http://blog.csdn.net/yanzi2006/archive/2006/09/10/1201828.aspx

看看这里 或者是看一下spring的源码
[/Quote]

对 可以去看看 源码的实现。
JavaAlpha 2009-12-14
  • 打赏
  • 举报
回复
http://blog.csdn.net/yanzi2006/archive/2006/09/10/1201828.aspx

看看这里 或者是看一下spring的源码
JavaAlpha 2009-12-14
  • 打赏
  • 举报
回复
通过动态Proxy模式,在目标对象的方法调用前后插入相应的处理代码,任何的接口都能被代理,也符合”面向接口编程”的良好风格.
Spring实现原理,其内置的AOP默认使用动态代理模式实现,即在代码中不出现与具体应用相关的接口或者类引用.即这个代理类适用于任何接口的实现
单骑2009 2009-12-14
  • 打赏
  • 举报
回复
是不是都去吃饭了啊,吃完回来大家一定帮忙看看啊

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧