关于使用spring的动态代理机制时为什么必须指定接口

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

你可能感兴趣的:(关于使用spring的动态代理机制时为什么必须指定接口)