quote="firebody" ]
至于上面所說的動態(tài)代理,給你一個(gè)更簡單的說法,比如Spring里的TransactionProxyFactoryBean,他是對支持事務(wù)管理的一個(gè)代理FactoryBean,利用動態(tài)代理,這個(gè)類可以不依賴于具體的target 接口,用戶可以隨意選擇target 接口。也不需要用戶再手工根據(jù)自己的target 接口擴(kuò)展一個(gè)TransactionProxyFactoryBean。 這樣的一個(gè)用到j(luò)ava.lang.reflect的動態(tài)代理機(jī)制,使得用戶需要編寫的代碼量大大減小,也使得整個(gè)框架配置使用趨于一致。[/quote]
我奇怪的是,既然有下面這個(gè),
那么程序代碼中, 怎么可以這樣寫?
至于上面所說的動態(tài)代理,給你一個(gè)更簡單的說法,比如Spring里的TransactionProxyFactoryBean,他是對支持事務(wù)管理的一個(gè)代理FactoryBean,利用動態(tài)代理,這個(gè)類可以不依賴于具體的target 接口,用戶可以隨意選擇target 接口。也不需要用戶再手工根據(jù)自己的target 接口擴(kuò)展一個(gè)TransactionProxyFactoryBean。 這樣的一個(gè)用到j(luò)ava.lang.reflect的動態(tài)代理機(jī)制,使得用戶需要編寫的代碼量大大減小,也使得整個(gè)框架配置使用趨于一致。[/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> |
我奇怪的是,既然有下面這個(gè),
java代碼: |
<bean id="someObjectProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> |
那么程序代碼中, 怎么可以這樣寫?
java代碼: |
ISomeInterface someObjectProxy = (ISomeInterface) context .getBean("someObjectProxy"); |
注意,這里返回的是ISomeInterface ,而且這個(gè)someObjectProxy 對象已經(jīng)具有了ILock+I(xiàn)SomeInterface 的功能,并且在行為表現(xiàn)的完全和ISomeInterface 一致。
如果Spring的代碼是預(yù)編譯的,那可以產(chǎn)生stub之類的,可這里是怎么實(shí)現(xiàn)的,挺讓人奇怪哦,誰能解釋一下么?
答案 : http://www.javajia.com/article.php?id=919
只是在這上面再封裝的完美罷了,好好研究dynamic proxy的實(shí)現(xiàn)吧。
此外,還有這一段哦 :)
AOP的作用可以簡單如下所說:“在一個(gè)組件的前后加上一些固定的內(nèi)容。” 拋開AOP不說,我們自己如果想要寫這東西,無非兩種方式,一個(gè)是proxy實(shí)現(xiàn),然后在proxy的前后添加內(nèi)容;還有一種就是template實(shí)現(xiàn)。
所以在我看來,數(shù)據(jù)庫層的模板其實(shí)也算是一種“AOP”。 不知道有沒人對此有些意見和評述?