Spring概述

起因:重新學(xué)習(xí)spring丸升,雖然每天都在用铆农,但卻并不是很了解他,甚至說是不怎么了解狡耻,只是用一些基本的東西顿涣,在遇到問題的時候波闹,按照常規(guī)思路去解決,或者去百度涛碑,
這當(dāng)然是一個方法精堕,但終究不是 長久之道,重新學(xué)一下spring蒲障,對面試歹篓,對自己都是很好的。


spring概述

面對spring學(xué)習(xí)揉阎,最簡單庄撮,最直接地方法就是面向問題學(xué)習(xí),首先毙籽,拋出以下幾個問題:

  • 什么是spring?
  • Spring框架的設(shè)計(jì)目標(biāo)洞斯,設(shè)計(jì)理念,和核心是什么
  • Spring的優(yōu)缺點(diǎn)是什么坑赡?
  • Spring有哪些應(yīng)用場景
  • Spring由哪些模塊組成烙如?
  • Spring 框架中都用到了哪些設(shè)計(jì)模式?
  • 詳細(xì)講解一下核心容器(spring context應(yīng)用上下文) 模塊
  • Spring框架中有哪些不同類型的事件
  • Spring 應(yīng)用程序有哪些不同組件毅否?
  • 使用 Spring 有哪些方式亚铁?

接下來對其進(jìn)行一個個的解析:

1.什么是spring?

  • 是什么?

Spring是一個輕量級Java開發(fā)框架螟加,目的是為了解決企業(yè)級應(yīng)用開發(fā)的業(yè)務(wù)邏輯層和其他各層的耦合問題徘溢。
它是一個分層的JavaSE/JavaEE full-stack(一站式)輕量級開源框架,為開發(fā)Java應(yīng)用程序提供全面的基礎(chǔ)架構(gòu)支持捆探。
Spring負(fù)責(zé)基礎(chǔ)架構(gòu)然爆,因此Java開發(fā)者可以專注于應(yīng)用程序的開發(fā)。

  • 解決了什么問題?

Spring最根本的使命是解決企業(yè)級應(yīng)用開發(fā)的復(fù)雜性黍图,即簡化Java開發(fā)施蜜。

Spring可以做很多事情,它為企業(yè)級開發(fā)提供給了豐富的功能雌隅,但是這些功能的底層都依賴于它的兩個核心特性,也就是依賴注入(dependency injection缸沃,DI)和面向切面編程(aspect-oriented programming恰起,AOP)。

  • 如何解決的這些問題?

為了降低Java開發(fā)的復(fù)雜性趾牧,Spring采取了以下4種關(guān)鍵策略

  1. 基于POJO的輕量級和最小侵入性編程检盼;
  2. 通過依賴注入和面向接口實(shí)現(xiàn)松耦合;
  3. 基于切面和慣例進(jìn)行聲明式編程翘单;
  4. 通過切面和模板減少樣板式代碼吨枉。

總結(jié)

2.Spring框架的設(shè)計(jì)目標(biāo)蹦渣,設(shè)計(jì)理念,和核心是什么貌亭?

  • Spring設(shè)計(jì)目標(biāo):

Spring為開發(fā)者提供一個一站式輕量級應(yīng)用開發(fā)平臺柬唯;

  • Spring設(shè)計(jì)理念:

在JavaEE開發(fā)中,支持POJO和JavaBean開發(fā)方式圃庭,使應(yīng)用面向接口開發(fā)锄奢,充分支持OO(面向?qū)ο螅┰O(shè)計(jì)方法;Spring通過IoC容器實(shí)現(xiàn)對象耦合關(guān)系的管理剧腻,并實(shí)現(xiàn)依賴反轉(zhuǎn)拘央,將對象之間的依賴關(guān)系交給IoC容器,實(shí)現(xiàn)解耦书在;

POJO和JavaBean的區(qū)別:POJO其實(shí)是比javabean更純凈的簡單類或接口灰伟。POJO嚴(yán)格地遵守簡單對象的概念,而一些JavaBean中往往會封裝一些簡單邏輯儒旬。

  • Spring框架的核心:

IoC容器和AOP模塊栏账。通過IoC容器管理POJO對象以及他們之間的耦合關(guān)系;通過AOP以動態(tài)非侵入的方式增強(qiáng)服務(wù)义矛。

總結(jié)
IoC讓相互協(xié)作的組件保持松散的耦合发笔,而AOP編程允許你把遍布于應(yīng)用各層的功能分離出來形成可重用的功能組件。

3.Spring的優(yōu)缺點(diǎn)是什么凉翻?

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

  1. 方便解耦了讨,簡化開發(fā)

Spring就是一個大工廠,可以將所有對象的創(chuàng)建和依賴關(guān)系的維護(hù)制轰,交給Spring管理前计。

  1. AOP編程的支持

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

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

只需要通過配置就可以完成對事務(wù)的管理,而無需手動編程调俘。

  1. 方便程序的測試

Spring對Junit4支持伶棒,可以通過注解方便的測試Spring程序。

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

Spring不排斥各種優(yōu)秀的開源框架彩库,其內(nèi)部提供了對各種優(yōu)秀框架的直接支持(如:Struts肤无、Hibernate、MyBatis等)骇钦。

  1. 降低JavaEE API的使用難度

Spring對JavaEE開發(fā)中非常難用的一些API(JDBC宛渐、JavaMail、遠(yuǎn)程調(diào)用等),都提供了封裝窥翩,使這些API應(yīng)用難度大大降低业岁。

缺點(diǎn)

  1. Spring明明一個很輕量級的框架,卻給人感覺大而全
  2. Spring依賴反射寇蚊,反射影響性能
  3. 使用門檻升高笔时,入門Spring需要較長時間

4.Spring有哪些應(yīng)用場景?

應(yīng)用場景:JavaEE企業(yè)應(yīng)用開發(fā)幔荒,包括SSH糊闽、SSM等

Spring價(jià)值:

  • Spring是非侵入式的框架,目標(biāo)是使應(yīng)用程序代碼對框架依賴最小化爹梁;
  • Spring提供一個一致的編程模型右犹,使應(yīng)用直接使用POJO開發(fā),與運(yùn)行環(huán)境隔離開來姚垃;
  • Spring推動應(yīng)用設(shè)計(jì)風(fēng)格向面向?qū)ο蠛兔嫦蚪涌陂_發(fā)轉(zhuǎn)變念链,提高了代碼的重用性和可測試性;

5.Spring由哪些模塊組成积糯?

Spring 總共大約有 20 個模塊掂墓, 由 1300 多個不同的文件構(gòu)成。 而這些組件被分別整合在核心容器(Core Container) 看成、 AOP(Aspect Oriented Programming)和設(shè)備支持(Instrmentation) 君编、數(shù)據(jù)訪問與集成(Data Access/Integeration) 、 Web川慌、 消息(Messaging) 吃嘿、 Test等 6 個模塊中。
以下是 Spring 5 的模塊結(jié)構(gòu)圖:

Spring5模塊結(jié)構(gòu)圖
  • spring core:提供了框架的基本組成部分梦重,包括控制反轉(zhuǎn)(Inversion of Control兑燥,IOC)和依賴注入(Dependency Injection,DI)功能琴拧。
  • spring beans:提供了BeanFactory降瞳,是工廠模式的一個經(jīng)典實(shí)現(xiàn),Spring將管理對象稱為Bean蚓胸。
  • spring context:構(gòu)建于 core 封裝包基礎(chǔ)上的 context 封裝包挣饥,提供了一種框架式的對象訪問方法。
  • spring jdbc:提供了一個JDBC的抽象層沛膳,消除了煩瑣的JDBC編碼和數(shù)據(jù)庫廠商特有的錯誤代碼解析扔枫, 用于簡化JDBC。
  • spring aop:提供了面向切面的編程實(shí)現(xiàn)于置,讓你可以自定義攔截器、切點(diǎn)等。
  • spring Web:提供了針對 Web 開發(fā)的集成特性八毯,例如文件上傳搓侄,利用 servlet listeners 進(jìn)行 ioc 容器初始化和針對 Web 的 ApplicationContext。
  • spring test:主要為測試提供支持的话速,支持使用JUnit或TestNG對Spring組件進(jìn)行單元測試和集成測試讶踪。

6.Spring 框架中都用到了哪些設(shè)計(jì)模式?

  • 工廠模式:BeanFactory就是簡單工廠模式的體現(xiàn)泊交,用來創(chuàng)建對象的實(shí)例乳讥;
  • 單例模式:Bean默認(rèn)為單例模式。
  • 代理模式:Spring的AOP功能用到了JDK的動態(tài)代理和CGLIB字節(jié)碼生成技術(shù)廓俭;
  • 模板方法:用來解決代碼重復(fù)的問題云石。比如. RestTemplate, JmsTemplate, JpaTemplate。
  • 觀察者模式:定義對象鍵一種一對多的依賴關(guān)系研乒,當(dāng)一個對象的狀態(tài)發(fā)生改變時汹忠,所有依賴于它的對象都會得到通知被制動更新,如Spring中l(wèi)istener的實(shí)現(xiàn)–ApplicationListener雹熬。

7.詳細(xì)講解一下核心容器(spring context應(yīng)用上下文) 模塊?

這是基本的Spring模塊,提供spring 框架的基礎(chǔ)功能智亮,BeanFactory 是 任何以spring為基礎(chǔ)的應(yīng)用的核心溉委。Spring 框架建立在此模塊之上,它使Spring成為一個容器烈菌。

Bean 工廠是工廠模式的一個實(shí)現(xiàn)阵幸,提供了控制反轉(zhuǎn)功能,用來把應(yīng)用的配置和依賴從真正的應(yīng)用代碼中分離僧界。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory 侨嘀,它根據(jù)XML文件中的定義加載beans。該容器從XML 文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個完全配置的系統(tǒng)或應(yīng)用捂襟。

8.Spring框架中有哪些不同類型的事件咬腕?

Spring 提供了以下5種標(biāo)準(zhǔn)的事件:

  • 上下文更新事件(ContextRefreshedEvent):在調(diào)用ConfigurableApplicationContext 接口中的refresh()方法時被觸發(fā)。

  • 上下文開始事件(ContextStartedEvent):當(dāng)容器調(diào)用ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發(fā)該事件葬荷。

  • 上下文停止事件(ContextStoppedEvent):當(dāng)容器調(diào)用ConfigurableApplicationContext的Stop()方法停止容器時觸發(fā)該事件涨共。

  • 上下文關(guān)閉事件(ContextClosedEvent):當(dāng)ApplicationContext被關(guān)閉時觸發(fā)該事件。容器被關(guān)閉時宠漩,其管理的所有單例Bean都被銷毀举反。

  • 請求處理事件(RequestHandledEvent):在Web應(yīng)用中,當(dāng)一個http請求(request)結(jié)束觸發(fā)該事件扒吁。如果一個bean實(shí)現(xiàn)了ApplicationListener接口火鼻,當(dāng)一個ApplicationEvent 被發(fā)布以后,bean會自動被通知。

9.Spring 應(yīng)用程序有哪些不同組件魁索?

Spring 應(yīng)用一般有以下組件:

  • 接口 - 定義功能融撞。
  • Bean 類 - 它包含屬性,setter 和 getter 方法粗蔚,函數(shù)等尝偎。
  • Bean 配置文件 - 包含類的信息以及如何配置它們。
  • Spring 面向切面編程(AOP) - 提供面向切面編程的功能鹏控。
  • 用戶程序 - 它使用接口致扯。

10.使用 Spring 有哪些方式?

使用 Spring 有以下方式:

  • 作為一個成熟的 Spring Web 應(yīng)用程序当辐。
  • 作為第三方 Web 框架抖僵,使用 Spring Frameworks 中間層。
  • 作為企業(yè)級 Java Bean瀑构,它可以包裝現(xiàn)有的 POJO(Plain Old Java Objects)裆针。
  • 用于遠(yuǎn)程使用。

不要以為每天把功能完成了就行了寺晌,這種思想是要不得的世吨,互勉~!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呻征,一起剝皮案震驚了整個濱河市耘婚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陆赋,老刑警劉巖沐祷,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異攒岛,居然都是意外死亡赖临,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門灾锯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兢榨,“玉大人,你說我怎么就攤上這事顺饮〕炒希” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵兼雄,是天一觀的道長吟逝。 經(jīng)常有香客問我,道長赦肋,這世上最難降的妖魔是什么块攒? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任励稳,我火速辦了婚禮,結(jié)果婚禮上囱井,老公的妹妹穿的比我還像新娘麦锯。我一直安慰自己,他們只是感情好琅绅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹅巍,像睡著了一般千扶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骆捧,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天澎羞,我揣著相機(jī)與錄音,去河邊找鬼敛苇。 笑死妆绞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枫攀。 我是一名探鬼主播括饶,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼来涨!你這毒婦竟也來了图焰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蹦掐,失蹤者是張志新(化名)和其女友劉穎技羔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卧抗,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藤滥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了社裆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拙绊。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浦马,靈堂內(nèi)的尸體忽然破棺而出时呀,到底是詐尸還是另有隱情,我是刑警寧澤晶默,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布谨娜,位于F島的核電站,受9級特大地震影響磺陡,放射性物質(zhì)發(fā)生泄漏趴梢。R本人自食惡果不足惜漠畜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坞靶。 院中可真熱鬧憔狞,春花似錦、人聲如沸彰阴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尿这。三九已至簇抵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間射众,已是汗流浹背碟摆。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叨橱,地道東北人典蜕。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像罗洗,于是被迫代替她去往敵國和親愉舔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • Spring是一個開源的輕量級JavaSE(Java標(biāo)準(zhǔn)版本)/JavaEE(Java企業(yè)版本)開發(fā)應(yīng)用框架伙菜,其目...
    CodeKing2017閱讀 298評論 0 0
  • 1.Spring 概述 概述 Spring 是最受歡迎的企業(yè)級 Java 應(yīng)用程序開發(fā)框架屑宠,數(shù)以百萬的來自世界各地...
    樂于呂閱讀 229評論 0 0
  • 1.1.1 Spring是什么 Spring是一個開源的輕量級Java SE(Java 標(biāo)準(zhǔn)版本)/Java E...
  • 1.1.1 Spring是什么 Spring是一個開源的輕量級Java SE(Java 標(biāo)準(zhǔn)版本)/Java E...
    消失er閱讀 171評論 0 1
  • 什么是spring? Spring 是個java企業(yè)級應(yīng)用的開源開發(fā)框架。Spring主要用來開發(fā)Java應(yīng)用仇让,但...
    AI喬治閱讀 385評論 0 3