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

单骑2009 单骑2009 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
可能我钻牛角尖了不过我还是想知道,望大家指点
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干嘛非要这个接口呢?

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

疑惑不解啊,求解答
...全文

相关推荐

JAVA的反射机制与动态代理.pdf

那个最近想看看Spring AOP的动态代理到底是个咋回事,特地学习了一下,写了个文档。 本文档先讲解了JDK的反射机制,然后是Proxy的动态代理、CGLIB的动态代理,因为这些是Spring AOP的底层技术,清楚了它们,你就更能够理解Spring AOP是如何工作的。在文档的最后简要写了Spring AOP的使用,因为这不是重点,网上Spring AOP的例子很多,本文档是为了给还不是十分清楚Spring AOP是如何工作的同学看的,希望有点儿启发作用!嘿嘿!

kwenge

Spring 中 AOP 的实现原理——动态代理

原文地址 https://www.cnblogs.com/tuyang1129/p/12878549.html Spring AOP 的实现原理 Spring的AOP实现原理其实很简单,就是通过动态代理实现的。如果我们为Spring的某个bean配置了切面,那么Spring在创建这个bean的时候,实际上创建的是这个bean的一个代理对象,我们后续对bean中方法的调用,实际上调用的是代理类重写的代理方法。而Spring的AOP使用了两种动态代理,分别是 JDK 的动态代理,以及 CGLib 的动态代理。

蔡定努

cglib-3.0.rar

cglib-3.0.jar,这个jar包可以用在动态代理开发,可以直接使用内部接口

sophy688

以注解方式模拟Spring IoC AOP

以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.

leoIsCoding

Spring框架中JDK动态代理和cglib动态代理

Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理

kansuny
评论 13
收藏 已收藏
分享
返回顶部
单骑2009
Java EE 67,535 成员 225,843 内容