spring為什麼要注入介面,而不是實現類

2021-09-02 21:45:33 字數 888 閱讀 9994

**:

首先說明,注入的物件確實為實現類的物件。(並不是實現類的**物件,注入並不涉及**)

如果只是單純注入是可以用實現類接收注入物件的,但是往往開發中會對實現類做增強,如事務,日誌等,實現增強的aop技術是通過動態**實現的,而spring預設是jdk動態**,對實現類物件做增強得到的增強類與實現類是兄弟關係,所以不能用實現類接收增強類物件,只能用介面接收。如:

//

介面:ia

//實現類:aimpl

//增強類:aimplproxy

aimpl aimpl = new

aimpl();

//通過jdkproxyfactory建立**物件

jdkproxyfactory factory = new

jdkproxyfactory(aimpl);

aimplproxy aimplproxy =factory.createproxy();

//這個增強類物件aimplproxy 只能強轉為ia,而不能轉為aimpl,因為jdk**得到的aimplproxy類與aimpl是兄弟關係而非父子

由於以上原因,如果將物件注入給實現類而非介面的話,在**時就會報錯。

解決方法,讓spring強制使用cglib**:

<

aop:aspectj-autoproxy

proxy-target-class

="true"

/>

cglib**類和實現類之間是父子關係,自然可以用父類(實現類)去接收子類物件(**類物件即增強類物件)。

不過應該不會需要這麼做,使用介面本來就是解耦的,你直接用實現類接收注入物件豈不是失去了注入的意義。(為什麼不直接new乙個呢?)

為什麼要進行介面測試?

1,什麼是介面?可以簡單理解成用來連線而開放的入口,比如前端和後端的連續需要用介面,移動端和後台的鏈結也需要用到介面。連線前端後端和移動端。2,介面都有哪些型別?介面一般分為兩種 1 程式內部的介面 2 系統對外的介面 系統對外的介面 比如你要從別的 或伺服器上獲取資源或資訊,別人肯定不會把資料庫共...

Spring介面注入

如下類 生成 package com.atguigu.crowdfunding.portal.web import org.springframework.beans.bean ception import org.springframework.stereotype.component 在持久層 ...

為什麼要採購訂單而不採購庫存?

一定要採購目前急需的東西,採購應該有了訂單以後再去採購,否則採購來的就是庫存。日本豐田汽車提出 庫存是萬惡之源 戴爾公司的老總說 我們沒有庫存,我們如果有庫存的話,那庫存的只是資訊,我們不庫存具體某個東西,而是庫存某個資訊,把資訊庫存起來。世界500強的首位 沃爾瑪成功經驗有兩點,第一是降低成本,第...