您好,登錄后才能下訂單哦!
這篇文章主要介紹“spring IOC是什么及有哪些設(shè)計(jì)模式”,在日常操作中,相信很多人在spring IOC是什么及有哪些設(shè)計(jì)模式問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”spring IOC是什么及有哪些設(shè)計(jì)模式”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
控制反轉(zhuǎn)(inversion of control)和依賴注入(dependency injection)其實(shí)是同一個(gè)概念。當(dāng)某個(gè)方法需要另外一個(gè)對(duì)象協(xié)助的時(shí)候,傳統(tǒng)的方法就是有調(diào)用者來(lái)通過(guò)new創(chuàng)建被調(diào)用者的實(shí)例,但是在spring中創(chuàng)建被調(diào)用者的工作不再有調(diào)用者來(lái)完成,稱之為控制反轉(zhuǎn)(ioc)。創(chuàng)建被調(diào)用者的工作由spring來(lái)完成,然后注入調(diào)用者,成為依賴注入。
這樣做得目的當(dāng)然是為了解耦,減低類之間得耦合度,其設(shè)計(jì)思想就是設(shè)計(jì)模式中得工廠模式。在spring容器啟動(dòng)得時(shí)候,spring會(huì)將配置項(xiàng)中配置好得bean都初始化。需要調(diào)用得時(shí)候,把初始化得bean分配給調(diào)用的類,而不需要手動(dòng)創(chuàng)建一個(gè)對(duì)象實(shí)例。
對(duì)于springIOC來(lái)說(shuō)由兩處地方最重要,一個(gè)是創(chuàng)建bean容器,一個(gè)是初始化bean。
在Sping IoC的體系結(jié)構(gòu)中BeanFactory作為最頂層的一個(gè)接口類,它定義了IoC容器的基本功能規(guī)范。并且為了區(qū)分在 Spring 內(nèi)部在操作過(guò)程中對(duì)象的傳遞和轉(zhuǎn)化過(guò)程中,對(duì)對(duì)象的數(shù)據(jù)訪問(wèn)做限制,使用了多層接口ListableBeanFactory 接口表示這些 Bean 是可列表的. HierarchicalBeanFactory 表示的是這些 Bean 是有繼承關(guān)系的,也就是每個(gè)Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定義 Bean 的自動(dòng)裝配規(guī)則。
默認(rèn)實(shí)現(xiàn)類是 DefaultListableBeanFactory,他實(shí)現(xiàn)了所有的接口.
在springIOC中用到的設(shè)計(jì)模式有四種:工廠模式,單例模式,策略模式,裝飾者模式。
Spring IOC容器就像是一個(gè)工廠一樣,當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)對(duì)象的時(shí)候,只需要配置好配置文件/注解即可,完全不用考慮對(duì)象是如何被創(chuàng)建出來(lái)的。IOC 容器負(fù)責(zé)創(chuàng)建對(duì)象,將對(duì)象連接在一起,配置這些對(duì)象,并從創(chuàng)建中處理這些對(duì)象的整個(gè)生命周期(多例的對(duì)象spring不會(huì)管理生命周期),直到它們被完全銷毀。
Spring使用工廠模式可以通過(guò)BeanFactory或者ApplicationContext創(chuàng)建bean對(duì)象。
BeanFactory:延遲注入(spring默認(rèn)為懶加載,即使用到某個(gè)bean的時(shí)候才會(huì)注入,可以通過(guò)@Lazy(false)設(shè)置為非懶加載)。相比于ApplicationContext來(lái)說(shuō)會(huì)占用更少的內(nèi)存。
ApplicationContext:容器啟動(dòng)的時(shí)候,不管有沒(méi)有用到,一次性創(chuàng)建所有的bean,ApplicationContext繼承了BeanFactory,除了BeanFactory的功能外還有額外的更多功能,所以一般使用的更多。
Spring 中 bean 的默認(rèn)作用域就是 singleton(單例)的。Spring中實(shí)現(xiàn)單例的方式有兩種:
xml : <bean id="userService" class="top.snailclimb.UserService" scope="singleton"/> 注解:@Scope(value = "singleton")
除了singleton作用域,Spring中bean還有下面幾種作用域:
prototype : 每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的 bean 實(shí)例。
request : 每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean,該bean僅在當(dāng)前HTTP request內(nèi)有效。
session : 每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的 bean,該bean僅在當(dāng)前 HTTP session 內(nèi)有效。
global-session: 全局session作用域,僅僅在基于portlet的web應(yīng)用中才有意義,Spring5已經(jīng)沒(méi)有了。Portlet是能夠生成語(yǔ)義代碼(例如:HTML)片段的小型Java Web插件。它們基于portlet容器,可以像servlet一樣處理HTTP請(qǐng)求。但是,與 servlet 不同,每個(gè) portlet 都有不同的會(huì)話。
在spring中通過(guò)ApplicationContext 來(lái)獲取Resource的實(shí)例,包括urlResource,classPathResource,fileSystenResource等不同的資源類型,spring針對(duì)不同的資源類型采取不同的訪問(wèn)策略。ApplicationContext 將會(huì)負(fù)責(zé)選擇 Resource 的實(shí)現(xiàn)類,也就是確定具體的資源訪問(wèn)策略,從而將應(yīng)用程序和具體的資源訪問(wèn)策略分離開來(lái)。
裝飾者模式可以動(dòng)態(tài)地給對(duì)象添加一些額外的屬性或行為。相比于使用繼承,裝飾者模式更加靈活。簡(jiǎn)單點(diǎn)兒說(shuō)就是當(dāng)我們需要修改原有的功能,但我們又不愿直接去修改原有的代碼時(shí),設(shè)計(jì)一個(gè)Decorator套在原有代碼外面。其實(shí)在 JDK 中就有很多地方用到了裝飾者模式,比如 InputStream家族,InputStream 類下有 FileInputStream (讀取文件)、BufferedInputStream (增加緩存,使讀取文件速度大大提升)等子類都在不修改InputStream 代碼的情況下擴(kuò)展了它的功能。
Spring中類中帶有Wrapper的都是包裝類。
到此,關(guān)于“spring IOC是什么及有哪些設(shè)計(jì)模式”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。