Spring(Ioc和Bean的作用域)

Spring

Spring為簡化開發(fā)而生,讓程序員只關(guān)心核心業(yè)務(wù)的實(shí)現(xiàn)各淀,盡可能的不在關(guān)注非業(yè)務(wù)邏輯代碼(事務(wù)控制懒鉴,安全日志等)。

1,Spring八大模塊

這八大模塊組成了Spring


1.1 Spring Core模塊

這是Spring框架的最基礎(chǔ)的部分临谱,它提供了依賴注入(DependencyInjection)特征來實(shí)現(xiàn)容器對(duì)Bean的管理璃俗。核心容器的主要組件時(shí)BeanFactory,BeanFactory是工廠模式的一個(gè)實(shí)現(xiàn)悉默,是任何Spring應(yīng)用的核心城豁。它使用Ioc將應(yīng)用配置和依賴從實(shí)際的應(yīng)用代碼中抽離出來。

1.2 Spring Context模塊

如果說核心模塊中的BeanFactory使Spring成為容器的話抄课,那么上下文模塊就是Spring成為框架的原因唱星。

這個(gè)模塊擴(kuò)展了BeanFactory,增加了對(duì)國際化(I18N)消息跟磨、事件傳播间聊、驗(yàn)證的支持。另外提供了許多企業(yè)服務(wù)抵拘,例如電子郵件哎榴、JNDI訪問、EJB集成僵蛛、遠(yuǎn)程以及時(shí)序調(diào)度(scheduling)服務(wù)尚蝌。也包括了對(duì)模版框架例如Velocity和FreeMarker集成的支持

1.3 Spring Aop模塊

Spring在他的AOP模塊中提供了對(duì)面向切面編程的豐富支持,Spring AOP 模塊為基于 Spirng 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)充尉。通過使用Spring AOP 飘言,不用依賴組件,就可以將聲名性事務(wù)管理集成到應(yīng)用程序中喉酌,可以自定義攔截器热凹、切點(diǎn)、日志等操作泪电。

1.4 Spring Dao模塊

提供了一個(gè)JDBC的抽象層和異常層次結(jié)構(gòu)般妙,消除了繁瑣的JDBC編碼和數(shù)據(jù)庫廠商特有的錯(cuò)誤代碼解析,用于簡化JDBC相速。

1.5 Spring ORM模塊

Spring提供了ORM模塊碟渺。Spring并不試圖實(shí)現(xiàn)它自己的ORM解決方案,而是為幾種流行的ORM框架提供了集成方案突诬,包括Hibernate苫拍、JDO和iBATIS SQL映射,這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)旺隙。

1.6 Spring Web MVC模塊

Spring為構(gòu)建Web應(yīng)用提供了一個(gè)功能全面的MVC框架绒极。雖然Spring可以很容易地與其它MVC框架集成,例如Struts蔬捷,但Spring的MVC框架使用IoC對(duì)控制邏輯和業(yè)務(wù)對(duì)象提供了完全的分離垄提。

1.7 Spring WebFlux模塊

Spring Framework 中包含的原始 Web 框架 Spring Web MVC 是專門為 Servlet API 和 Servlet 容器構(gòu)建的榔袋。反應(yīng)式堆棧 Web 框架 Spring WebFlux 是在 5.0 版的后期添加的。它是完全非阻塞的铡俐,支持反應(yīng)式流(Reactive Stream)背壓凰兑,并在Netty,Undertow和Servlet 3.1+容器等服務(wù)器上運(yùn)行

1.8 Spring Web模塊

Web 上下文模塊建立在應(yīng)用程序上下文模塊之上审丘,為基于 Web 的應(yīng)用程序提供了上下文吏够,提供了Spring和其它Web框架的集成,比如Struts滩报、WebWork锅知。還提供了一些面向服務(wù)支持,例如:實(shí)現(xiàn)文件上傳的multipart請(qǐng)求脓钾。

2喉镰,Spring的特點(diǎn)

2.1輕量

從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布惭笑。并且Spring所需的處理開銷也是微不足道的。

Spring是非侵入式的:Spring應(yīng)用中的對(duì)象不依賴于Spring的特定類生真。

2.2控制反轉(zhuǎn)

Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合沉噩。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴的其它對(duì)象會(huì)通過被動(dòng)的方式傳遞進(jìn)來柱蟀,而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴對(duì)象川蒙。你可以認(rèn)為IoC與JNDI相反——不是對(duì)象從容器中查找依賴,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴傳遞給它长已。

2.3面向切面

Spring提供了面向切面編程的豐富支持畜眨,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已术瓮。它們并不負(fù)責(zé)(甚至是意識(shí))其它的系統(tǒng)級(jí)關(guān)注點(diǎn)康聂,例如日志或事務(wù)支持。

2.4容器

Spring包含并管理應(yīng)用對(duì)象的配置和生命周期胞四,在這個(gè)意義上它是一種容器恬汁,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的辜伟。然而氓侧,Spring不應(yīng)該被混同于傳統(tǒng)的重量級(jí)的EJB容器,它們經(jīng)常是龐大與笨重的导狡,難以使用约巷。

框架

Spring可以將簡單的組件配置、組合成為復(fù)雜的應(yīng)用旱捧。在Spring中独郎,應(yīng)用對(duì)象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理囚聚、持久化框架集成等等)靖榕,將應(yīng)用邏輯的開發(fā)留給了你。

所有Spring的這些特征使你能夠編寫更干凈顽铸、更可管理茁计、并且更易于測試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持谓松。

3星压,Spring對(duì)IOC的實(shí)現(xiàn)

3.1 Ioc控制反轉(zhuǎn)

控制反轉(zhuǎn)是一種思想。

控制反轉(zhuǎn)是為了降低程序耦合度鬼譬,提高程序擴(kuò)展力娜膘,達(dá)到OCP原則,達(dá)到DIP原則优质。

控制反轉(zhuǎn)竣贪,反轉(zhuǎn)的是什么?

將對(duì)象的創(chuàng)建權(quán)利交出去巩螃,交給第三方容器負(fù)責(zé)演怎。

將對(duì)象和對(duì)象之間關(guān)系的維護(hù)權(quán)交出去,交給第三方容器負(fù)責(zé)避乏。

控制反轉(zhuǎn)這種思想如何實(shí)現(xiàn)呢爷耀?

DI(Dependency Injection):依賴注入

3.2 依賴注入

依賴注入實(shí)現(xiàn)了控制反轉(zhuǎn)的思想。

Spring通過依賴注入的方式來完成Bean管理的拍皮。

Bean管理說的是:Bean對(duì)象的創(chuàng)建歹叮,以及Bean對(duì)象中屬性的賦值(或者叫做Bean對(duì)象之間關(guān)系的維護(hù))。

依賴注入:

依賴指的是對(duì)象和對(duì)象之間的關(guān)聯(lián)關(guān)系铆帽。

注入指的是一種數(shù)據(jù)傳遞行為咆耿,通過注入行為來讓對(duì)象和對(duì)象產(chǎn)生關(guān)系。

依賴注入常見的實(shí)現(xiàn)方式包括兩種:

第一種:set注入

第二種:構(gòu)造注入

總結(jié):set注入的核心實(shí)現(xiàn)原理:通過反射機(jī)制調(diào)用set方法來給屬性賦值锄贼,讓兩個(gè)對(duì)象之間產(chǎn)生關(guān)系票灰。

通過測試得知,通過構(gòu)造方法注入的時(shí)候:

可以通過下標(biāo)

可以通過參數(shù)名

也可以不指定下標(biāo)和參數(shù)名宅荤,可以類型自動(dòng)推斷

4屑迂,Bean的作用域

4.1 singleton

默認(rèn)情況下,Spring的IoC容器創(chuàng)建的Bean對(duì)象是單例的冯键。

默認(rèn)情況下惹盼,Bean對(duì)象的創(chuàng)建是在初始化Spring上下文的時(shí)候就完成的。


4.2 prototype

Spring的Bean對(duì)象可以以多例的形式存在惫确,可以在bean標(biāo)簽中指定scope屬性的值為:prototype手报。這樣Spring會(huì)在每一次執(zhí)行g(shù)etBean()方法的時(shí)候創(chuàng)建Bean對(duì)象蚯舱,調(diào)用幾次則創(chuàng)建幾次。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

? ? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

? ? ? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

? ?<bean id="sb" class="com.powernode.spring6.beans.SpringBean" scope="prototype" />

</beans>

默認(rèn)是單例的(singleton)

4.3 其他scope

scope屬性的值不止兩個(gè)掩蛤,它一共包括8個(gè)選項(xiàng):

singleton:默認(rèn)的枉昏,單例。

prototype:原型揍鸟。每調(diào)用一次getBean()方法則獲取一個(gè)新的Bean對(duì)象兄裂。或每次注入的時(shí)候都是新對(duì)象阳藻。

request:一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)Bean晰奖。僅限于在WEB應(yīng)用中使用

session:一個(gè)會(huì)話對(duì)應(yīng)一個(gè)Bean腥泥。僅限于在WEB應(yīng)用中使用匾南。

global session:portlet應(yīng)用中專用的。如果在Servlet的WEB應(yīng)用中使用global session的話蛔外,和session一個(gè)效果蛆楞。(portlet和servlet都是規(guī)范。servlet運(yùn)行在servlet容器中夹厌,例如Tomcat臊岸。portlet運(yùn)行在portlet容器中。)

application:一個(gè)應(yīng)用對(duì)應(yīng)一個(gè)Bean尊流。僅限于在WEB應(yīng)用中使用。

websocket:一個(gè)websocket生命周期對(duì)應(yīng)一個(gè)Bean灯帮。僅限于在WEB應(yīng)用中使用崖技。

自定義scope:很少使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钟哥,一起剝皮案震驚了整個(gè)濱河市迎献,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腻贰,老刑警劉巖吁恍,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異播演,居然都是意外死亡冀瓦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門写烤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翼闽,“玉大人,你說我怎么就攤上這事洲炊「芯郑” “怎么了尼啡?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長询微。 經(jīng)常有香客問我崖瞭,道長,這世上最難降的妖魔是什么撑毛? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任书聚,我火速辦了婚禮,結(jié)果婚禮上代态,老公的妹妹穿的比我還像新娘寺惫。我一直安慰自己,他們只是感情好蹦疑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布西雀。 她就那樣靜靜地躺著,像睡著了一般歉摧。 火紅的嫁衣襯著肌膚如雪艇肴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天叁温,我揣著相機(jī)與錄音再悼,去河邊找鬼。 笑死膝但,一個(gè)胖子當(dāng)著我的面吹牛冲九,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跟束,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼莺奸,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了冀宴?” 一聲冷哼從身側(cè)響起灭贷,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎略贮,沒想到半個(gè)月后甚疟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逃延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年览妖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揽祥。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黄痪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盔然,到底是詐尸還是另有隱情桅打,我是刑警寧澤是嗜,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站挺尾,受9級(jí)特大地震影響鹅搪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遭铺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一丽柿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魂挂,春花似錦甫题、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至果正,卻和暖如春炎码,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秋泳。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工潦闲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迫皱。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓歉闰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卓起。 傳聞我的和親對(duì)象是個(gè)殘疾皇子新娜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容