首先網上搜了一下為什么在專案中我要去注入一個service的時候用介面去接收而不是用sevice介面的實作類接收?得到的回答是,aop是基于jdk動態代理的,而jdk動態代理是基于介面的,所以要用介面去接收。
然后我今天自己寫動態代理小案例的時候發現如果傳入一個實作類貌似也可以實作動態代理?(前提:當然這個實作類實作了某一個介面)那我是不是可以這么理解,spring里面要求你去用介面去接收一個物件其實就是為了保證這個物件一定實作了某個介面?
uj5u.com熱心網友回復:
介面只是規范, 有介面,然后在實作介面. 這樣更規范而已. 動態代理是為了實作aop的, 我目前寫的專案 全是注入的類,不是介面. 所以,并不是 注入一個service, 一定要有介面接收.uj5u.com熱心網友回復:
所以事實上現在spring不會管你注入的是什么型別?你注入的實體物件有實作介面就用jdk動態代理,沒有實作介面就用cglib?uj5u.com熱心網友回復:
這個就不知道了,沒深究過,所以不敢肯定回答你 應該是的吧uj5u.com熱心網友回復:
以下是我的理解,不對之處敬請指教,歡迎探討。我感覺你好像有點把di和aop混淆了。DI的實作方式是反射,AOP的實作方式是動態代理。首先說一下DI吧,只要在xml組態檔中指定了全限定類名,就能反射出一個物件,并在需要的時候注入,這樣看來在程式中使用介面和實作類來接收該物件都行,那么為什么要使用介面呢?這也是使用IoC的原因,就是解耦。比如業務要求我使用某一套邏輯處理業務,因此撰寫了serviceA,過一段時間換邏輯了,因此撰寫serviceB,很顯然他們對外介面都是一樣的。但是其它層如果之前不是使用介面來接收的話也得修改代碼。
除了基于jdk,AOP也可以使用基于cglib的動態代理,也叫做基于子類的代理,不要求被代理類實作介面。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/120118.html
標籤:Web 開發
上一篇:Java開發
下一篇:33歲學java不知前路如何?
