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的动态代理机制时为什么必须指定接口
最新推荐文章于 2021-07-07 11:56:49 发布