quote="firebody" ]
至于上面所说的动态代理,给你一个更简单的说法,比如Spring里的TransactionProxyFactoryBean,他是对支持事务管理的一个代理FactoryBean,利用动态代理,这个类可以不依赖于具体的target 接口,用户可以随意选择target 接口。也不需要用户再手工根据自己的target 接口扩展一个TransactionProxyFactoryBean。 这样的一个用到java.lang.reflect的动态代理机制,使得用户需要编写的代码量大大减小,也使得整个框架配置使用趋于一致。[/quote]
java代码: |
<bean id="someObjectProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>ISomeInterface</value> </property> <property name="target"> <ref bean="someObject"/> </property> <property name="interceptorNames"> <list> <value>lockMixinAdvisor</value> </list> </property> </bean>
|
我奇怪的是,既然有下面这个,
java代码: |
<bean id="someObjectProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
|
那么程序代码中, 怎么可以这样写?
java代码: |
ISomeInterface someObjectProxy = (ISomeInterface) context .getBean("someObjectProxy");
|
注意,这里返回的是ISomeInterface ,而且这个someObjectProxy 对象已经具有了ILock+ISomeInterface 的功能,并且在行为表现的完全和ISomeInterface 一致。
如果Spring的代码是预编译的,那可以产生stub之类的,可这里是怎么实现的,挺让人奇怪哦,谁能解释一下么?
答案 : http://www.javajia.com/article.php?id=919
只是在这上面再封装的完美罢了,好好研究dynamic proxy的实现吧。
此外,还有这一段哦 :)
AOP的作用可以简单如下所说:“在一个组件的前后加上一些固定的内容。” 抛开AOP不说,我们自己如果想要写这东西,无非两种方式,一个是proxy实现,然后在proxy的前后添加内容;还有一种就是template实现。
所以在我看来,数据库层的模板其实也算是一种“AOP”。 不知道有没人对此有些意见和评述?