請談一談Spring中自動裝配的方式有哪些?
考察點:spring框架
參考回答:
- no:不進行自動裝配懈涛,手動設置Bean的依賴關系汪榔。
- byName:根據(jù)Bean的名字進行自動裝配哎榴。
- byType:根據(jù)Bean的類型進行自動裝配。
- constructor:類似于byType,不過是應用于構造器的參數(shù)溢豆,如果正好有一個Bean與構造器的參數(shù)類型相同則可以自動裝配烦粒,否則會導致錯誤。
- autodetect:如果有默認的構造器蚤氏,則通過constructor的方式進行自動裝配甘耿,否則使用byType的方式進行自動裝配。
自動裝配沒有自定義裝配方式那么精確竿滨,而且不能自動裝配簡單屬性(基本類型佳恬、字符串等),在使用時應注意于游。
請問Spring中Bean的作用域有哪些毁葱?
考察點:框架
參考回答:
在Spring的早期版本中,僅有兩個作用域:singleton和prototype贰剥,前者表示Bean以單例的方式存在倾剿;后者表示每次從容器中調用Bean時,都會返回一個新的實例蚌成,prototype通常翻譯為原型前痘。
設計模式中的創(chuàng)建型模式中也有一個原型模式凛捏,原型模式也是一個常用的模式,例如做一個室內(nèi)設計軟件际度,所有的素材都在工具箱中葵袭,而每次從工具箱中取出的都是素材對象的一個原型,可以通過對象克隆來實現(xiàn)原型模式乖菱。Spring 2.x中針對WebApplicationContext新增了3個作用域坡锡,分別是:request(每次HTTP請求都會創(chuàng)建一個新的Bean)、session(同一個HttpSession共享同一個Bean窒所,不同的HttpSession使用不同的Bean)和globalSession(同一個全局Session共享一個Bean)鹉勒。
單例模式和原型模式都是重要的設計模式。一般情況下吵取,無狀態(tài)或狀態(tài)不可變的類適合使用單例模式禽额。在傳統(tǒng)開發(fā)中,由于DAO持有Connection這個非線程安全對象因而沒有使用單例模式皮官;但在Spring環(huán)境下脯倒,所有DAO類對可以采用單例模式,因為Spring利用AOP和Java API中的ThreadLocal對非線程安全的對象進行了特殊處理捺氢。
請問什么是IoC和DI藻丢?并且簡要說明一下DI是如何實現(xiàn)的?
考察點:控制反轉
參考回答:
IoC叫控制反轉摄乒,是Inversion of Control的縮寫悠反,DI(Dependency Injection)叫依賴注入,是對IoC更簡單的詮釋馍佑≌瘢控制反轉是把傳統(tǒng)上由程序代碼直接操控的對象的調用權交給容器,通過容器來實現(xiàn)對象組件的裝配和管理拭荤。所謂的"控制反轉"就是對組件對象控制權的轉移茵臭,從程序代碼本身轉移到了外部容器,由容器來創(chuàng)建對象并管理對象之間的依賴關系舅世。IoC體現(xiàn)了好萊塢原則 - "Don’t call me, we will call you"笼恰。依賴注入的基本原則是應用組件不應該負責查找資源或者其他依賴的協(xié)作對象。配置對象的工作應該由容器負責歇终,查找資源的邏輯應該從應用組件的代碼中抽取出來社证,交給容器來完成。DI是對IoC更準確的描述评凝,即組件之間的依賴關系由容器在運行期決定追葡,形象的來說,即由容器動態(tài)的將某種依賴關系注入到組件之中。
一個類A需要用到接口B中的方法宜肉,那么就需要為類A和接口B建立關聯(lián)或依賴關系匀钧,最原始的方法是在類A中創(chuàng)建一個接口B的實現(xiàn)類C的實例,但這種方法需要開發(fā)人員自行維護二者的依賴關系谬返,也就是說當依賴關系發(fā)生變動的時候需要修改代碼并重新構建整個系統(tǒng)之斯。如果通過一個容器來管理這些對象以及對象的依賴關系,則只需要在類A中定義好用于關聯(lián)接口B的方法(構造器或setter方法)遣铝,將類A和接口B的實現(xiàn)類C放入容器中佑刷,通過對容器的配置來實現(xiàn)二者的關聯(lián)。
依賴注入可以通過setter方法注入(設值注入)酿炸、構造器注入和接口注入三種方式來實現(xiàn)瘫絮,Spring支持setter注入和構造器注入,通常使用構造器注入來注入必須的依賴關系填硕,對于可選的依賴關系麦萤,則setter注入是更好的選擇,setter注入需要類提供無參構造器或者無參的靜態(tài)工廠方法來創(chuàng)建對象扁眯。
請說明一下Spring中BeanFactory和ApplicationContext的區(qū)別是什么壮莹?
考察點:spring框架
參考回答:
概念:
BeanFactory:
BeanFactory是spring中比較原始,比較古老的Factory姻檀。因為比較古老命满,所以BeanFactory無法支持spring插件,例如:AOP施敢、Web應用等功能周荐。
ApplicationContext
ApplicationContext是BeanFactory的子類狭莱,因為古老的BeanFactory無法滿足不斷更新的spring的需求僵娃,于是ApplicationContext就基本上代替了BeanFactory的工作,以一種更面向框架的工作方式以及對上下文進行分層和實現(xiàn)繼承腋妙,并在這個基礎上對功能進行擴展:
<1>MessageSource, 提供國際化的消息訪問
<2>資源訪問(如URL和文件)
<3>事件傳遞
<4>Bean的自動裝配
<5>各種不同應用層的Context實現(xiàn)
區(qū)別:
<1>如果使用ApplicationContext默怨,如果配置的bean是singleton,那么不管你有沒有或想不想用它骤素,它都會被實例化匙睹。好處是可以預先加載,壞處是浪費內(nèi)存济竹。
<2>BeanFactory痕檬,當使用BeanFactory實例化對象時,配置的bean不會馬上被實例化送浊,而是等到你使用該bean的時候(getBean)才會被實例化梦谜。好處是節(jié)約內(nèi)存,壞處是速度比較慢。多用于移動設備的開發(fā)唁桩。
<3>沒有特殊要求的情況下闭树,應該使用ApplicationContext完成。因為BeanFactory能完成的事情荒澡,ApplicationContext都能完成报辱,并且提供了更多接近現(xiàn)在開發(fā)的功能。
請說明一下springIOC原理是什么单山?如果你要實現(xiàn)IOC需要怎么做碍现?請簡單描述一下實現(xiàn)步驟?
考察點:spring
參考回答:
①IoC(Inversion of Control饥侵,控制倒轉)鸵赫。這是spring的核心,貫穿始終躏升。所謂IoC辩棒,對于spring框架來說,就是由spring來負責控制對象的生命周期和對象間的關系膨疏。
IoC的一個重點是在系統(tǒng)運行中一睁,動態(tài)的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection佃却,依賴注入)來實現(xiàn)的者吁。比如對象A需要操作數(shù)據(jù)庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象饲帅,有了 spring我們就只需要告訴spring复凳,A中需要一個Connection,至于這個Connection怎么構造灶泵,何時構造育八,A不需要知道。在系統(tǒng)運行時赦邻,spring會在適當?shù)臅r候制造一個Connection髓棋,然后像打針一樣,注射到A當中惶洲,這樣就完成了對各個對象之間關系的控制按声。A需要依賴 Connection才能正常運行,而這個Connection是由spring注入到A中的恬吕,依賴注入的名字就這么來的签则。那么DI是如何實現(xiàn)的呢? Java 1.3之后一個重要特征是反射(reflection)铐料,它允許程序在運行的時候動態(tài)的生成對象渐裂、執(zhí)行對象的方法侨颈、改變對象的屬性,spring就是通過反射來實現(xiàn)注入的芯义。
舉個簡單的例子哈垢,我們找女朋友常見的情況是,我們到處去看哪里有長得漂亮身材又好的女孩子扛拨,然后打聽她們的興趣愛好耘分、qq號、電話號绑警、ip號求泰、iq號………,想辦法認識她們计盒,投其所好送其所要渴频,這個過程是復雜深奧的,我們必須自己設計和面對每個環(huán)節(jié)北启。傳統(tǒng)的程序開發(fā)也是如此卜朗,在一個對象中,如果要使用另外的對象咕村,就必須得到它(自己new一個场钉,或者從JNDI中查詢一個),使用完之后還要將對象銷毀(比如Connection等)懈涛,對象始終會和其他的接口或類藕合起來逛万。
②實現(xiàn)IOC的步驟
定義用來描述bean的配置的Java類
解析bean的配置,將bean的配置信息轉換為上面的BeanDefinition對象保存在內(nèi)存中批钠,spring中采用HashMap進行對象存儲宇植,其中會用到一些xml解析技術
遍歷存放BeanDefinition的HashMap對象,逐條取出BeanDefinition對象埋心,獲取bean的配置信息指郁,利用Java的反射機制實例化對象,將實例化后的對象保存在另外一個Map中即可踩窖。
請簡單說明一下依賴注入的方式有哪幾種坡氯?以及這些方法如何使用晨横?
考察點:spring
參考回答:
1洋腮、Set注入 2、構造器注入 3手形、接口注入
請說明一下@Controller和@RestController的區(qū)別是什么啥供?
考察點:spring
參考回答:
@RestController注解相當于@ResponseBody + @Controller合在一起的作用
請問在以前的學習中有使用過Spring里面的注解嗎?如果有請談一下autowired 和resource區(qū)別是什么库糠?
考察點:Spring
參考回答:
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提供,需要導入包javax.annotation.Resource须蜗。@Resource有兩個重要的屬性:name和type硅确,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型明肮。所以疏魏,如果使用name屬性,則使用byName的自動注入策略晤愧,而使用type屬性時則使用byType自動注入策略大莫。如果既不制定name也不制定type屬性,這時將通過反射機制使用byName自動注入策略官份。
請介紹一下bean的生命周期
考察點:spring
參考回答:
Spring生命周期流程圖: