自動裝配沒有自定義裝配方式那麼精確,而且不能自動裝配簡單屬性(基本型別、字串等),在使用時應注意。
在spring的早期版本中,僅有兩個作用域:singleton和prototype,前者表示bean以單例的方式存在,ioc容器建立時就建立;後者表示ioc容器建立時不建立,在每次從容器中呼叫bean時,都會返回乙個新的例項,prototype通常翻譯為原型。
單例模式和原型模式都是重要的設計模式。一般情況下,無狀態或狀態不可變的類適合使用單例模式。在傳統開發中,由於dao持有connection這個非執行緒安全物件因而沒有使用單例模式;但在spring環境下,所有dao類可以採用單例模式,因為spring利用aop和j**a api中的threadlocal對非執行緒安全的物件進行了特殊處理。
ioc叫控制反轉,是inversion of control的縮寫,di(dependency injection)叫依賴注入,是對ioc更簡單的詮釋。控制反轉是把傳統上由程式**直接操控的物件的呼叫權交給容器,通過容器來實現物件元件的裝配和管理。所謂的"控制反轉"就是對元件物件控制權的轉移,從程式**本身轉移到了外部容器,由容器來建立物件並管理物件之間的依賴關係。ioc體現了好萊塢原則 - "don』t call me, we will call you"。依賴注入的基本原則是應用元件不應該負責查詢資源或者其他依賴的協作物件。配置物件的工作應該由容器負責,查詢資源的邏輯應該從應用元件的**中抽取出來,交給容器來完成。di是對ioc更準確的描述,即元件之間的依賴關係由容器在執行期決定,形象的來說,即由容器動態的將某種依賴關係注入到元件之中。
乙個類a需要用到介面b中的方法,那麼就需要為類a和介面b建立關聯或依賴關係,最原始的方法是在類a中建立乙個介面b的實現類c的例項,但這種方法需要開發人員自行維護二者的依賴關係,也就是說當依賴關係發生變動的時候需要修改**並重新構建整個系統。如果通過乙個容器來管理這些物件以及物件的依賴關係,則只需要在類a中定義好用於關聯介面b的方法(構造器或setter方法),將類a和介面b的實現類c放入容器中,通過對容器的配置來實現二者的關聯。
依賴注入可以通過setter方法注入(設值注入)、構造器注入和介面注入三種方式來實現,spring支援setter注入和構造器注入,通常使用構造器注入來注入必須的依賴關係,對於可選的依賴關係,則setter注入是更好的選擇,setter注入需要類提供無參構造器或者無參的靜態工廠方法來建立物件。
①ioc(inversion of control,控制倒轉)。這是spring的核心,貫穿始終。所謂ioc,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。
ioc的乙個重點是在系統執行中,動態的向某個物件提供它所需要的其他物件。這一點是通過di(dependency injection,依賴注入)來實現的。比如物件a需要運算元據庫,以前我們總是要在a中自己編寫**來獲得乙個connection物件,有了 spring我們就只需要告訴spring,a中需要乙個connection,至於這個connection怎麼構造,何時構造,a不需要知道。在系統執行時,spring會在適當的時候製造乙個connection,然後像打針一樣,注射到a當中,這樣就完成了對各個物件之間關係的控制。a需要依賴 connection才能正常執行,而這個connection是由spring注入到a中的,依賴注入的名字就這麼來的。那麼di是如何實現的呢? j**a 1.3之後乙個重要特徵是反射(reflection),它允許程式在執行的時候動態的生成物件、執行物件的方法、改變物件的屬性,spring就是通過反射來實現注入的。
②實現ioc的步驟
定義用來描述bean的配置的j**a類
解析bean的配置,將bean的配置資訊轉換為上面的beandefinition物件儲存在記憶體中,spring中採用hashmap進行物件儲存,其中會用到一些xml解析技術
遍歷存放beandefinition的hashmap物件,逐條取出beandefinition物件,獲取bean的配置資訊,利用j**a的反射機制例項化物件,將例項化後的物件儲存在另外乙個map中即可。
1、共同點
兩者都可以寫在字段和setter方法上。兩者如果都寫在字段上,那麼就不需要再寫setter方法。
2、不同點
(1)@autowired
@autowired為spring提供的註解,需要匯入包org.springframework.beans.factory.annotation.autowired;只按照bytype注入。
@autowired註解是按照型別(bytype)裝配依賴物件,預設情況下它要求依賴物件必須存在,如果允許null值,可以設定它的required屬性為false。如果我們想使用按照名稱(byname)來裝配,可以結合@qualifier註解一起使用。
(2)@resource
@resource預設按照byname自動注入,由j2ee提供,需要匯入包j**ax.annotation.resource。@resource有兩個重要的屬性:name和type,而spring將@resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以,如果使用name屬性,則使用byname的自動注入策略,而使用type屬性時則使用bytype自動注入策略。如果既不制定name也不制定type屬性,這時將通過反射機制使用byname自動注入策略。
面試題總結 html面試題)
附上鏈結 doctype 的作用是什麼?宣告一般位於文件的第一行,它的作用主要是告訴瀏覽器以什麼樣的模式來解析文件。一般指定了之後會以標準模式來 進行文件解析,否則就以相容模式進行解析。在標準模式下,瀏覽器的解析規則都是按照最新的標準進行解析的。而在相容模式下,瀏 覽器會以向後相容的方式來模擬老式瀏...
spring面試題目
目錄 一 spring mvc工作原理二 為什麼要用spring 1 spring能很好的與各大框架進行整合 2 建立物件時,如果我們不用spring需要用工廠模式來建立,這個spring相當於工廠模式已經幫我們做了建立物件的功能 ioc 依賴注入 3 在用hibernate的時候,如果不用spri...
Spring面試題分享
1.下面關於 依賴注入 的說法,錯誤的是 d a.將元件間的依賴關係採取配置檔案的方式管理,而不是硬編碼在 中 b.降低了元件間的耦合,使程式更容易維護和公升級 c.促進了 面向介面程式設計 使構建大規模程式更輕鬆 d.需要定義大量介面,增加編碼複雜度 2.關於spring說法錯誤的是 b a.sp...