使用spring的动态代理功能时为什么必须指定要代理的目标类的接口?
可能我钻牛角尖了不过我还是想知道,望大家指点
spring中配置代理的一般方法:
注意这里:
指定要代理的类所实现的接口。
我一直不明白的是使用动态代理的时候,下面明明已经指定了要代理的对象“sysUserDao”,为什么上面还要多此一举必须指定这个对象所实现的接口呢?
这样做导致我必须为不想写接口但又想使用spring动态代理功能的类去写一个接口……,
后来在《spring技术手册》这本书上看到,spring动态代理功能的实现是基于java的动态代理机制,好吧我们再来看java的动态代理机制:
主要的原理是使用Proxy.newProxyInstance()方法创建一个代理对象来代理指定的类,查阅JDK文档这个方法有三个参数:
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
第一个参数为要代理的类,第二个参数为这个类的接口(。。),第三个暂且不管。
哦这下明白了,原来java实现动态代理的时候要求必须有接口类,导致spring也这么向我们要求了。
但是问题又来了,java干嘛非要这个接口呢?
难道是为了规范和安全需要?
疑惑不解啊,求解答
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是如何工作的同学看的,希望有点儿启发作用!嘿嘿!
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包可以用在动态代理开发,可以直接使用内部接口
以注解方式模拟Spring IoC AOP
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
Spring框架中JDK动态代理和cglib动态代理
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理


