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”。 不知道有沒人對此有些意見和評述?