一篇告訴你什么是Spring

閱讀全文大概需要7分鐘

前言

大多數(shù)文章講"什么到Spring?"上來(lái)就是控制反轉(zhuǎn)(IoC)或依賴注入(DI)和面向切面編程(AOP)笛谦,拿著官網(wǎng)文檔直譯 copy益兄。對(duì)小白來(lái)說(shuō)并不友好节视,看完可能還是一頭霧水彻况。下面是我利用業(yè)余時(shí)間整理的一些資料霜旧、書(shū)籍和自己的理解囱怕,致力于更容易理解方式講 Spring磷支。

[toc]

什么是Spring ?

Spring 是一個(gè)開(kāi)源框架棺棵,Spring是于2003 年興起的一個(gè)輕量級(jí)的Java 開(kāi)發(fā)框架楼咳,由 Rod Johnson 在其著作 Expert One-On-One J2EE Development and Design 中闡述的部分理念和原型衍生而來(lái)。它是為了解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的烛恤∧噶框架的主要優(yōu)勢(shì)之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個(gè)組件缚柏,同時(shí)為 J2EE 應(yīng)用程序開(kāi)發(fā)提供集成的框架苹熏。Spring 使用基本的 JavaBean 來(lái)完成以前只可能由 EJB 完成的事情。

然而,Spring的用途不僅限于服務(wù)器端的開(kāi)發(fā)轨域。從簡(jiǎn)單性袱耽、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益干发。Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)朱巨。簡(jiǎn)單來(lái)說(shuō),Spring 是一個(gè)分層的 JavaSE/EE full-stack(一站式) 輕量級(jí)開(kāi)源框架枉长。

簡(jiǎn)單來(lái)說(shuō)冀续,它是一個(gè)容器框架,用來(lái)裝 javabean(java對(duì)象)必峰,中間層框架(萬(wàn)能膠)可以起一個(gè)連接作用洪唐,比如說(shuō)把 Struts 和 hibernate 粘合在一起運(yùn)用。簡(jiǎn)單來(lái)說(shuō)吼蚁,Spring 是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架凭需。

如果你現(xiàn)在還有點(diǎn)疑惑,通讀全文桂敛,你一定有所收獲

Spring 模塊

以下內(nèi)容都是基于 Spring 4 及以上的

Spring 官網(wǎng)圖片

image
  • Spring Core:Spring核心模塊功炮,主要提供 ioC 依賴注入、
  • Spring Context:向Spring框架提供上下文信息术唬、
  • Spring AOP:面向切面編程薪伏,為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)、
  • Spring JDBC:Java數(shù)據(jù)庫(kù)連接粗仓、
  • Spring JMS:Java消息服務(wù)嫁怀、
  • Spring ORM:用于支持 MyBatis、Hibernate 等 ORM 工具借浊、
  • Spring Web:為創(chuàng)建Web應(yīng)用程序提供支持塘淑、
  • Spring Test:提供了對(duì) JUnit 和 TestNG 測(cè)試的支持、
  • Spring Aspects:該模塊為與AspectJ的集成提供支持蚂斤。
  • Spring Web:Spring框架支持與Struts集成存捺,為基于web的應(yīng)用程序提供了上下文。

Spring的優(yōu)點(diǎn)

  • 方便解耦曙蒸,簡(jiǎn)化開(kāi)發(fā) (高內(nèi)聚低耦合)

Spring就是一個(gè)大工廠(容器)捌治,可以將所有對(duì)象創(chuàng)建和依賴關(guān)系維護(hù),交給Spring管理纽窟,spring工廠是用于生成bean

  • AOP編程的支持

Spring提供面向切面編程肖油,可以方便的實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截、運(yùn)行監(jiān)控等功能

  • 聲明式事務(wù)的支持

只需要通過(guò)配置就可以完成對(duì)事務(wù)的管理臂港,而無(wú)需手動(dòng)編程

  • 方便程序的測(cè)試

Spring對(duì)Junit4支持森枪,可以通過(guò)注解方便的測(cè)試Spring程序

  • 方便集成各種優(yōu)秀框架

Spring不排斥各種優(yōu)秀的開(kāi)源框架视搏,其內(nèi)部提供了對(duì)各種優(yōu)秀框架(如:Struts、Hibernate县袱、MyBatis浑娜、Quartz等)的直接支持

  • 降低JavaEE API的使用難度

Spring 對(duì) JavaEE 開(kāi)發(fā)中非常難用的一些 API(JDBC、JavaMail式散、遠(yuǎn)程調(diào)用等)棚愤,都提供了封裝,使這些 API 應(yīng)用難度大大降低

我對(duì) Spring IoC 和 AOP 理解

Spring 中最重要的概念 IoC 和 AOP

IoC(Inversion of Control)控制反轉(zhuǎn)

IoC 需要 DI(依賴注入)的支持為什么呢杂数?因?yàn)闆](méi)有 DI 的注入 Spring 創(chuàng)造出的對(duì)象都是空值是無(wú)法使用的,所以說(shuō) IoCDI 多數(shù)是同時(shí)出現(xiàn)人們眼前的。

IOCInversion of Control 的縮寫(xiě)瘸洛,多數(shù)書(shū)籍翻譯成“控制反轉(zhuǎn)”揍移。為了解決對(duì)象之間的耦合度過(guò)高的問(wèn)題,軟件專(zhuān)家 Michael Mattson 提出了 IOC 理論反肋,用來(lái)實(shí)現(xiàn)對(duì)象之間的解耦那伐。

2004年,Martin Fowler探討了同一個(gè)問(wèn)題石蔗,既然IOC是控制反轉(zhuǎn)罕邀,那么到底是“哪些方面的控制被反轉(zhuǎn)了呢?”养距,經(jīng)過(guò)詳細(xì)地分析和論證后诉探,他得出了答案:“獲得依賴對(duì)象的過(guò)程被反轉(zhuǎn)了”」餮幔控制被反轉(zhuǎn)之后肾胯,獲得依賴對(duì)象的過(guò)程由自身管理變?yōu)榱擞?IOC 容器主動(dòng)注入。于是耘纱,他給“控制反轉(zhuǎn)”取了一個(gè)更合適的名字叫做“依賴注入(Dependency Injection)”敬肚。他的這個(gè)答案,實(shí)際上給出了實(shí)現(xiàn) IOC 的方法:注入束析。所謂依賴注入艳馒,就是由IOC容器在運(yùn)行期間,動(dòng)態(tài)地將某種依賴關(guān)系注入到對(duì)象之中员寇。

依賴注入(DI)和控制反轉(zhuǎn)(IOC)是從不同的角度的描述的同一件事情弄慰,就是指通過(guò)引入 IOC 容器,利用依賴關(guān)系注入的方式丁恭,實(shí)現(xiàn)對(duì)象之間的解耦曹动。

背景介紹完了,講講我的理解

IoC 就是依賴倒置原則的一種設(shè)計(jì)思路牲览,就是將原本在程序中自己手動(dòng)創(chuàng)建對(duì)象的控制權(quán)墓陈,交由 Spring 框架來(lái)管理恶守。Spring 框架負(fù)責(zé)控制對(duì)象的生命周期對(duì)象之間的關(guān)系。IoC 在其他語(yǔ)言中也有應(yīng)用贡必,并非 Spirng 特有兔港。ioc 容器實(shí)際上就是個(gè) map(key,value)仔拟,里面存的是各種對(duì)象(在xml里配置的bean節(jié)點(diǎn)||repository衫樊、service、controller利花、component)科侈。

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è)生命周期睡扬,直到它們被完全銷(xiāo)毀盟蚣。

在實(shí)際項(xiàng)目中一個(gè) Service 類(lèi)如果有幾百甚至上千個(gè)類(lèi)作為它的底層,我們需要實(shí)例化這個(gè) Service卖怜,你可能要每次都要搞清這個(gè) Service 所有底層類(lèi)的構(gòu)造函數(shù)屎开,這可能會(huì)把人逼瘋。如果利用 IOC 的話韧涨,你只需要配置好牍戚,然后在需要的地方引用就行了,這大大增加了項(xiàng)目的可維護(hù)性且降低了開(kāi)發(fā)難度虑粥。

推薦閱讀:

https://www.zhihu.com/question/23277575/answer/169698662

IoC容器的初始化過(guò)程可以分為三步:

  1. Resource 定位(Bean的定義文件定位)如孝、
  2. 將 Resource 定位好的資源載入到 BeanDefinition、
  3. 將 BeanDefiniton 注冊(cè)到容器中
image

IoC 源碼:

https://javadoop.com/post/spring-ioc

AOP(Aspect-OrientedProgramming)面向切面編程

什么是 AOP娩贷?

AOP(Aspect Oriented Programming 面向切面編程)第晰,在程序開(kāi)發(fā)中主要用來(lái)解決一些系統(tǒng)層面上的問(wèn)題,比如日志收集彬祖,事務(wù)管理茁瘦,權(quán)限,緩存储笑,對(duì)象池管理等。

AOP 可以說(shuō)是 OOP(Object Oriented Programming突倍,面向?qū)ο缶幊蹋┑难a(bǔ)充和完善。OOP 引入封裝淡喜、繼承炼团、多態(tài)等概念來(lái)建立一種對(duì)象層次結(jié)構(gòu)瘟芝,用于模擬公共行為的一個(gè)集合模狭。不過(guò) OOP 允許開(kāi)發(fā)者定義縱向的關(guān)系,但并不適合定義橫向的關(guān)系驱富,例如日志功能匹舞。日志代碼往往橫向地散布在所有對(duì)象層次中赐稽,而與它對(duì)應(yīng)的對(duì)象的核心功能毫無(wú)關(guān)系對(duì)于其他類(lèi)型的代碼姊舵,如安全性括丁、異常處理和透明的持續(xù)性也都是如此史飞,這種散布在各處的無(wú)關(guān)的代碼被稱為橫切(cross cutting),在 OOP 設(shè)計(jì)中抽诉,它導(dǎo)致了大量代碼的重復(fù)迹淌,而不利于各個(gè)模塊的重用巍沙。

AOP技術(shù)恰恰相反句携,它利用一種稱為"橫切"的技術(shù)矮嫉,剖解開(kāi)封裝的對(duì)象內(nèi)部蠢笋,并將那些影響了多個(gè)類(lèi)的公共行為封裝到一個(gè)可重用模塊昨寞,并將其命名為"Aspect"援岩,即切面享怀。所謂"切面"添瓷,簡(jiǎn)單說(shuō)就是那些與業(yè)務(wù)無(wú)關(guān)鳞贷,卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái)搀愧,便于減少系統(tǒng)的重復(fù)代碼妈橄,降低模塊之間的耦合度眷蚓,并有利于未來(lái)的可操作性和可維護(hù)性沙热。

Spring AOP

Spring AOP就是基于動(dòng)態(tài)代理的,底層實(shí)現(xiàn)有倆種方式:一種是 JDK 動(dòng)態(tài)代理(JDK Proxy)枫疆,另一種是 CGLib(Code Generation Library(基于字節(jié)碼操作)) 的方式息楔。

如果要被代理的對(duì)象是個(gè)實(shí)現(xiàn)類(lèi)值依,那么 Spring 會(huì)使用 JDK動(dòng)態(tài)代理來(lái)完成操作(Spirng 默認(rèn)采用JDK動(dòng)態(tài)代理實(shí)現(xiàn)機(jī)制)愿险;如果要被代理的對(duì)象不是個(gè)實(shí)現(xiàn)類(lèi)那么,Spring 會(huì)強(qiáng)制使用 CGLib 來(lái)實(shí)現(xiàn)動(dòng)態(tài)代理褒链。

image

推薦閱讀:http://www.reibang.com/p/5b9a0d77f95f

當(dāng)然甸鸟,也可以使用 AspectJ 抢韭,AspectJ 可以做Spring AOP干不了的事情刻恭,它是 AOP 編程的完全解決方案鳍贾。

Spring AOP 和 AspectJ AOP 有什么區(qū)別橡淑?

Spring AOP 屬于運(yùn)行時(shí)增強(qiáng)梁棠;而 AspectJ 是編譯時(shí)增強(qiáng)符糊。Spring AOP 只能在運(yùn)行時(shí)織入行贪,AspectJ 運(yùn)行時(shí)織入不可用瓮顽,支持編譯時(shí)暖混、編譯后和加載時(shí)織入。

AspectJ 相比于 Spring AOP 功能更加強(qiáng)大贮配,但是 Spring AOP 相對(duì)來(lái)說(shuō)更簡(jiǎn)單泪勒。

Spring 的 bean

bean 的作用域有哪些 ?

image

Spring bean 單例與線程安全問(wèn)題

線程安全一直是代碼編寫(xiě)的重地,我們大多時(shí)候在系統(tǒng)開(kāi)發(fā)中不會(huì)使用多線程油讯。單例 bean 存在線程安全問(wèn)題,當(dāng)多個(gè)線程操作同一個(gè)對(duì)象的時(shí)候诀紊,這個(gè)對(duì)象的非靜態(tài)成員變量會(huì)存在線程安全問(wèn)題笤喳。

解決方法:

  1. 在類(lèi)中定義一個(gè)ThreadLocal成員變量,將需要的可變成員變量保存在 ThreadLocal 中(推薦的一種方式呜象,這也是常用一種)恭陡;

2.在Bean對(duì)象中盡量避免定義可變的成員變量。

Spring bean 的生命周期

在傳統(tǒng)的Java應(yīng)用中,bean的生命周期很簡(jiǎn)單呐矾,使用Java關(guān)鍵字 new 進(jìn)行Bean 的實(shí)例化,然后該Bean 就能夠使用了。一旦bean不再被使用,則由Java自動(dòng)進(jìn)行垃圾回收削罩。

相比之下,Spring管理Bean的生命周期就復(fù)雜多了,正確理解Bean 的生命周期非常重要以蕴。一個(gè)Bean的構(gòu)造過(guò)程:

image

談?wù)剬?duì) Spring MVC 的理解

說(shuō)到了 Spring ,那一定提一下 Spring MVC,各種講 SSM 的技術(shù)博客大家應(yīng)該都見(jiàn)了很多咆瘟。

在我初學(xué)時(shí) Java须肆,那時(shí)講的是 “Java Bean(Model) + JSP(View) + Servlet(Controller)” 這種開(kāi)發(fā)模式幢炸,這是早期的 JavaWeb MVC。

Spring MVC 是一款很優(yōu)秀的 MVC 框架闸天“可以讓我們的開(kāi)發(fā)更簡(jiǎn)潔,而且它和 Spring 是無(wú)縫集成,是 Spring 的一個(gè)子模塊,是我們上面提到 Spring 大家族中 Web 模塊潜必。

Spring MVC 框架主要由 DispatcherServlet 、處理器映射、處理器(控制器)、視圖解析器、視圖組成耕陷。

Spring MVC 流程圖很重要:

image

Spring 事務(wù)聲明

事務(wù)管理對(duì)于企業(yè)應(yīng)用來(lái)說(shuō)是至關(guān)重要的掂名,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性哟沫。

  1. 編程式事務(wù)饺蔑,在代碼中硬編碼。(不推薦使用)
  2. 聲明式事務(wù)嗜诀,在配置文件中配置(推薦使用)

聲明式事務(wù)又分為兩種:

  1. 基于XML的聲明式事務(wù)
  2. 基于注解的聲明式事務(wù)

比較重要的一點(diǎn)是

@Transactional(rollbackFor = Exception.class)注解

@Transactional 注解中如果不配置 rollbackFor 屬性,那么事物只會(huì)在遇到 RuntimeException 的時(shí)候才會(huì)回滾,加上 rollbackFor=Exception.class ,可以讓事物在遇到非運(yùn)行時(shí)異常時(shí)也回滾猾警。

后記

scope 是范圍的意思,在絕地求生中 scope 意為瞄準(zhǔn)鏡,如果你的隊(duì)友是個(gè)老外你就和他說(shuō) i want this 4times scope 他就明白了。

下篇結(jié)合代碼一塊講解

聲明:參考來(lái)源互聯(lián)網(wǎng)隆敢,有任何爭(zhēng)議可以留言发皿。站在前人的肩上,我們才能看的更遠(yuǎn)拂蝎。

本教程純手打穴墅,致力于最實(shí)用教程,希望多多轉(zhuǎn)發(fā)支持温自,對(duì)我真的很重要玄货。
歡迎來(lái)我公眾號(hào),希望可以結(jié)識(shí)你捣作,更多原創(chuàng)PDF誉结,微信搜索:JavaPub鹅士,回復(fù):【666】券躁,也可以催更。

有任何問(wèn)題都可以來(lái)談?wù)?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末也拜,一起剝皮案震驚了整個(gè)濱河市以舒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慢哈,老刑警劉巖蔓钟,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卵贱,居然都是意外死亡滥沫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)键俱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兰绣,“玉大人,你說(shuō)我怎么就攤上這事编振∽罕纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵踪央,是天一觀的道長(zhǎng)臀玄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)畅蹂,這世上最難降的妖魔是什么健无? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮魁莉,結(jié)果婚禮上睬涧,老公的妹妹穿的比我還像新娘。我一直安慰自己旗唁,他們只是感情好畦浓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著检疫,像睡著了一般讶请。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屎媳,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天夺溢,我揣著相機(jī)與錄音,去河邊找鬼烛谊。 笑死风响,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丹禀。 我是一名探鬼主播状勤,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鞋怀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了持搜?” 一聲冷哼從身側(cè)響起密似,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葫盼,沒(méi)想到半個(gè)月后残腌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贫导,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年抛猫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孩灯。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邑滨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钱反,到底是詐尸還是另有隱情掖看,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布面哥,位于F島的核電站哎壳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尚卫。R本人自食惡果不足惜归榕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吱涉。 院中可真熱鬧刹泄,春花似錦、人聲如沸怎爵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鳖链。三九已至姆蘸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芙委,已是汗流浹背逞敷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灌侣,地道東北人推捐。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像侧啼,于是被迫代替她去往敵國(guó)和親牛柒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愕秫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353