Spring學(xué)習(xí)筆記專題一

專題一
(1)Spring Framework Runtime


Test模塊支持使用JUnit和TestNG對(duì)Spring組件進(jìn)行測(cè)試。Core Container(核心容器)包含有Beans综膀、Core翻斟、Context和SpEL模塊切诀。AOP模塊提供了一個(gè)符合AOP聯(lián)盟標(biāo)準(zhǔn)的面向切面編程的實(shí)現(xiàn)面粮。Data Access/Integration層包含有JDBC禾蚕、ORM杜恰、OXM薄料、JMS和Transaction模塊敞贡。Web層包含了Web、Web-Servlet摄职、WebSocket誊役、Web-Porlet模塊。
(2)輕量級(jí)JavaEE VS 重量級(jí)(傳統(tǒng))JavaEE兩層含義:
1谷市,輕量級(jí)是相對(duì)于重量級(jí)而言的蛔垢,輕量級(jí)一般就是非入侵性的、所依賴的東西非常少迫悠、資源占用非常少啦桌、部署簡(jiǎn)單等等,其實(shí)就是比較容易使用及皂,而重量級(jí)正好相反甫男。
2,相比較傳統(tǒng)的JavaEE項(xiàng)目验烧,即真正意義上的JavaEE規(guī)范(比如EJB3.0板驳;JPA;JMX碍拆;JMS若治;JNDI;JSF等)感混,我們把能直接在Tomcat等符合JavaServlet規(guī)范的Web服務(wù)器上能直接運(yùn)行的Java應(yīng)用稱為輕量級(jí)的JavaEE應(yīng)用端幼;一般就意味著以Spring為代表的一些事實(shí)上的標(biāo)準(zhǔn)開發(fā)框架;可以說弧满,Spring就是運(yùn)行在Web服務(wù)器中的ApplicationServer婆跑;
(3)Spring的系列產(chǎn)品;Spring Boot:為基于Spring的應(yīng)用開發(fā)提供了基礎(chǔ)的項(xiàng)目構(gòu)建;Spring Data:用于簡(jiǎn)化數(shù)據(jù)庫訪問庭呜,并支持云服務(wù)的開源框架滑进。旨在統(tǒng)一和簡(jiǎn)化對(duì)各類型持久化存儲(chǔ)犀忱, 而不拘泥是關(guān)系型數(shù)據(jù)庫還是NoSQL數(shù)據(jù)存儲(chǔ)。Spring Batch:專門針對(duì)企業(yè)級(jí)系統(tǒng)中的日常批處理任務(wù)的輕量級(jí)框架扶关,能夠幫助開發(fā)者方便地開發(fā)出強(qiáng)壯阴汇、高效的批處理應(yīng)用程序。Spring Integration:為Spring編程模型提供了一個(gè)支持企業(yè)集成模式(Enterprise Integration Patterns)的擴(kuò)展节槐,在應(yīng)用程序中提供輕量級(jí)的消息機(jī)制搀庶,可以通過聲明式的適配器與外部系統(tǒng)進(jìn)行集成。Spring Security:早期稱為Acegi铜异,基于Spring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架;哥倔。Spring Roo:快速應(yīng)用程序開發(fā)工具,可以在短時(shí)間內(nèi)方便地構(gòu)建應(yīng)用程序熙掺。Spring Mobile:對(duì)Spring MVC的擴(kuò)展,旨在簡(jiǎn)化移動(dòng)Web應(yīng)用的開發(fā)咕宿。Spring for Android:用于簡(jiǎn)化Android原生應(yīng)用程序開發(fā)的Spring擴(kuò)展币绩。
(4)Spring的版本
Spring2.5:
¨擁抱驅(qū)動(dòng)編程。
支持SimpleJdbcTemplate的命名參數(shù)操作府阀。
Spring3.x:
不再支持JDK1.4;
¨全面支持泛型缆镣。
支持SpEL.
支持WebService的OXM。
Spring4.x:
支持Java8试浙,支持JavaEE6規(guī)范董瞻。
泛型限定式依賴注入。
對(duì)Hibernate4的集成和事務(wù)提供更好的管理方案田巴。
(5)IOC的概念
IoC:inverseof control钠糊,即控制反轉(zhuǎn);
簡(jiǎn)單的說壹哺,就是把對(duì)象的實(shí)例化工作交給容器來完成抄伍;

遇到的問題:
1,業(yè)務(wù)代碼都使用接口,按照接口編程,能夠解除耦合;
2,使用傳統(tǒng)的開發(fā)方式,雖然在業(yè)務(wù)聲明,業(yè)務(wù)代表調(diào)用上確實(shí)使用的是接口,但是這個(gè)業(yè)務(wù)類的實(shí)體需要客戶端自己去初始化,初始化一定是某一個(gè)具體的接口實(shí)現(xiàn)類,所以,并沒有做到完全的解耦;

A和B兩個(gè)類,A類使用到B類,A類就要負(fù)責(zé)B類的實(shí)例化過程,
怎么做?A類依賴B類,A類不要直接去實(shí)例化B類,而是把實(shí)例化B類的過程交給容器,A類只需要從容器中取得初始化的實(shí)例化對(duì)象;
(6)基于Spring的HelloWorld:
1,基礎(chǔ)代碼(接口+實(shí)現(xiàn));
2,拷貝core.jar和beans.jar
3,告訴spring要管理的bean--->配置文件(在spring中配置文件一般命名為application.xml或者appliactionContext.xml)


4,測(cè)試:

在HelloWorld實(shí)例中,注意:
1,從容器中拿對(duì)象,使用的是接口拿(這樣才能真正做到解耦);
2,研究從Spring中拿Bean的原理:
1,先從classpath下加載Spring的配置文件;
2,使用配置文件創(chuàng)建一個(gè)BeanFactory對(duì)象;
1,遍歷配置文件中所有的bean元素;
2,根據(jù)bean元素的class屬性去創(chuàng)建一個(gè)對(duì)象的實(shí)例(Class.forName(“class”)).newInstance();
3,把創(chuàng)建好的實(shí)例+bean元素中的id存放到容器中;
3,使用getBean方法的時(shí)候,就是按照查詢(getBean)的方式,從容器中找到合適的bean的實(shí)例并返回;

** ****結(jié)論:**
1,默認(rèn)情況下,交給Spring管理的bean必須有一個(gè)默認(rèn)的構(gòu)造方法;
2,在Spring中,配置的每一個(gè)bean其實(shí)是一個(gè)實(shí)例;
3,根據(jù)配置的class,調(diào)用的是Class.forName(“class”)).newInstance()---->newClass....
所以,Spring其實(shí)就是把本來應(yīng)該寫在代碼中的初始化代表移動(dòng)到XML中了;
(7)Spring中bean的名稱:
1,Spring中的模塊管理:
在Spring中,如果大量的類都配置在一個(gè)配置文件中,難以管理,可以按照模塊,把bean配置在不同的XML中,并使用主的配置文件來引入這些模塊的配置文件;


2,Spring中的bean的名稱:

(8)Spring中的測(cè)試:

之前的測(cè)試存在的問題:
1,每一個(gè)測(cè)試方法,都需要手動(dòng)啟動(dòng)Spring;相當(dāng)于Spring容器是運(yùn)行在測(cè)試類的方法中的;
2,每一個(gè)測(cè)試方法,都需要手動(dòng)啟動(dòng)Spring,還需要正常的關(guān)閉Spring;
3,各個(gè)模塊的配置文件混淆在一起;

Spring中的測(cè)試,不僅僅是提供了更好的測(cè)試方式,在Spring的測(cè)試包中,還包括了很多Mock對(duì)象,還有用于事務(wù)控制的測(cè)試或者集成測(cè)試等很多輔助的測(cè)試工具;


步驟:
1,拷包(替換默認(rèn)的eclipse的JUNIT環(huán)境;拷貝context.jar,expression.jar,aop.jar)
2,在類上使用@RunWith
3,在類上使用@ContextConfiguration;
4,在類中使用@Autowire標(biāo)簽放在BeanFactory屬性上;
5,在測(cè)試代碼中,只需要直接從BeanFactory獲取bean即可;
(9)容器:
1,Spring中最簡(jiǎn)單的,最基礎(chǔ)的容器 BeanFactory;
在BeanFactory中,提供了一些最基本的容器的方法;最重要的就是提供了從容器中拿對(duì)象的方法;
因?yàn)锽eanFactory提供的功能太簡(jiǎn)單了,所以平時(shí)開發(fā)時(shí)很少使用;

2,Spring中最常用的容器:ApplicationContext
1,ApplicationContext繼承了BeanFactory接口,所以,ApplicationContext也提供了最基本的拿bean的方法;
2,ApplicationContext在BeanFactory的基礎(chǔ)之上,提供了更多的應(yīng)用所需的功能:
1,容器環(huán)境的感知;
2,bean的繼承;
3,國(guó)際化;
4,Spring的事件機(jī)制;
5,統(tǒng)一的資源處理;
6,AOP;
3,ApplicationContext的使用:
1,在Springtest中的使用(在使用Spring-test的時(shí)候,啟動(dòng)的本來就是ApplicationContext容器):



2,手動(dòng)創(chuàng)建ApplicationContext容器;


(10)Spring中在不同容器下,bean的初始化時(shí)機(jī);1,BeanFactory是在真正去拿bean的時(shí)候,才會(huì)去創(chuàng)建bean的實(shí)例(延遲實(shí)例化);
2,ApplicationContext是在容器啟動(dòng)的時(shí)候就已經(jīng)創(chuàng)建好了bean的實(shí)例(迫切實(shí)例化);

延遲實(shí)例化的優(yōu)勢(shì):應(yīng)用啟動(dòng)的時(shí)候占用的資源很小管宵;適合資源緊張的應(yīng)用截珍;
迫切實(shí)例化的優(yōu)勢(shì):應(yīng)用在啟動(dòng)的時(shí)候已經(jīng)實(shí)例化所有的對(duì)象,就可以在啟動(dòng)的時(shí)候發(fā)現(xiàn)對(duì)象的錯(cuò)誤或者為這些對(duì)象做更多的事情(比如AOP)箩朴;
建議Web應(yīng)用中岗喉,就使用迫切加載;

當(dāng)然,也可以在bean上面添加lazy-init=true來讓ApplicationContext也延遲實(shí)例化對(duì)象;
還可以在beans上面配置default-lazy-init=true讓整個(gè)beans中所有的bean全部延遲實(shí)例化;

(11)Spring中bean的實(shí)例化方式:bean是怎么創(chuàng)建出來的.
1,bean使用默認(rèn)的構(gòu)造方法創(chuàng)建:


2,靜態(tài)工廠方法;

配置文件:

拿bean:

3,實(shí)例工廠方法:

配置文件:

拿bean:

4,Spring內(nèi)置的工廠類;
1,創(chuàng)建一個(gè)工廠類,實(shí)現(xiàn)FactoryBean接口;

2,配置:

3,獲取bean:

(12):spring處理factorybean的過程:
1,先從classpath下加載Spring的配置文件;
2,使用配置文件創(chuàng)建一個(gè)ApplicationContext對(duì)象;
1,遍歷配置文件中所有的bean元素;
2,根據(jù)bean元素的class屬性去創(chuàng)建一個(gè)對(duì)象的實(shí)例(Class.forName(“class”)).newInstance();
3,判斷當(dāng)前創(chuàng)建的對(duì)象是否是一個(gè)FactoryBean的實(shí)例;
3.1如果不是,繼續(xù)向下執(zhí)行
3.2是一個(gè)FactoryBean接口;
1,先把這個(gè)實(shí)例+&id存放到容器中;
2,FactoryBean bean=(FactoryBean)instance;
然后調(diào)用bean.getObject()創(chuàng)建一個(gè)實(shí)例,然后再把這個(gè)實(shí)例+id存放到容器中;
3,把創(chuàng)建好的實(shí)例+bean元素中的id存放到容器中;
3,使用getBean方法的時(shí)候,就是按照查詢(getBean)的方式,從容器中找到合適的bean的實(shí)例并返回;
4,總結(jié):如果一個(gè)類繼承了Spring中提供的內(nèi)部的某一個(gè)接口,當(dāng)我把這個(gè)類配置在Spring容器中,這個(gè)類就有了一些Spring特殊的功能;
(13)****Bean的Scope:1,默認(rèn)情況下,Spring中的bean都是單例的;
2,可以通過bean的scope屬性來配置對(duì)象的生命周期范圍
1,default/singleton:默認(rèn)的配置,代表bean是單例的
2,prototype:
把scope設(shè)置為prototpe炸庞,每次得到的對(duì)象都是一個(gè)全新的對(duì)象钱床;
prototype類型的bean,在容器啟動(dòng)的時(shí)候不會(huì)創(chuàng)建埠居,只會(huì)在每次從容器拿對(duì)象的時(shí)候诞丽,才會(huì)創(chuàng)建鲸拥;
3,request:在一次請(qǐng)求中創(chuàng)建一個(gè)對(duì)象,必須依賴HTTP環(huán)境
session:在一次會(huì)話中創(chuàng)建一個(gè)對(duì)象僧免,必須依賴HTTP環(huán)境

3,什么時(shí)候使用prototype?線程不安全的對(duì)象交給Spring管理,就必須設(shè)置為prototype,比如struts2的Action;

(14)Bean的初始化方法和銷毀方法:1,有的時(shí)候,在bean初始化完成之后,還要調(diào)用一些初始化方法才能讓bean處于立刻可用狀態(tài);
2,有的時(shí)候,在spring正常關(guān)閉,銷毀bean的時(shí)候,需要調(diào)用bean的一些銷毀方法來正常釋放資源;
3,可以通過bean上面的init-method和destory-method來配置


4,注意,init-method和dstory-method都不能有參數(shù);
5,如何手動(dòng)正常關(guān)閉Spring容器?
a:

b:

6,多例的對(duì)象是不會(huì)調(diào)用destory-method的;
(14)IOC容器

(15)什么叫DI(Dependence inject),依賴注入
對(duì)象的屬性關(guān)系由spring來管理;對(duì)象的屬性由Spring來設(shè)置;

兩種注入方式:
1,使用Setter注入(使用屬性的對(duì)應(yīng)的setter方法來注入,要求set方法);
2,使用構(gòu)造器注入
(16)使用setter注入:
1,簡(jiǎn)單類型;


2,某一些復(fù)雜類型;


1,從spring配置文件中得到的值(value能夠配置的值)都是String類型的,但是針對(duì)某些類型,Spring內(nèi)部可以直接把String類型轉(zhuǎn)化對(duì)應(yīng)的類型;
2,Spring的轉(zhuǎn)型依賴PropertyEditor;
3,其他的bean;

4,集合; 1,list 2,set 3,map 4,properties 集合注入在一般情況下面不會(huì)使用,一般是一些框架相關(guān)的bean才會(huì)使用到;
(17)構(gòu)造方法注入:
1刑赶,如果在bean中沒有配置constructor-arg參數(shù),則spring會(huì)使用對(duì)象默認(rèn)的無參構(gòu)造方法實(shí)例化對(duì)象懂衩;
2撞叨,如果在bean中配置了constructor-arg參數(shù),spring會(huì)使用這些constructor-arg去唯一確定一個(gè)構(gòu)造方法浊洞,并使用這個(gè)構(gòu)造方法創(chuàng)建對(duì)象實(shí)例牵敷;

確定構(gòu)造方法?
1法希,默認(rèn)情況下枷餐,constructor-arg的順序就是構(gòu)造方法參數(shù)的順序(在實(shí)際使用中,推薦就按照默認(rèn)的方式來設(shè)置值即可)苫亦;
2毛肋,三種方式可以調(diào)整構(gòu)造方法參數(shù)的順序:
1,index:通過構(gòu)造方法參數(shù)位置來指定屋剑;從0開始润匙;
2,type:在構(gòu)造方法中參數(shù)的類型唉匾;
3孕讳,name:使用構(gòu)造方法參數(shù)的名字來設(shè)置;

(18)setter VS 構(gòu)造方法注入
1巍膘,使用setter和構(gòu)造方法都能夠正確的注入bean的屬性厂财;
2,構(gòu)造方法可以更強(qiáng)制的規(guī)定依賴的對(duì)象必須存在峡懈,如果不配置蟀苛,則創(chuàng)建對(duì)象失敗逮诲;但是構(gòu)造方法不宜有過多的參數(shù)帜平,否則代碼難以維護(hù);
3梅鹦,更多的還是使用setter方式的注入裆甩,但是setter注入可能會(huì)產(chǎn)生忘記配置的問題,可以使用@Required注解來配置齐唆;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗤栓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茉帅,老刑警劉巖叨叙,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異堪澎,居然都是意外死亡擂错,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門樱蛤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钮呀,“玉大人,你說我怎么就攤上這事昨凡∷祝” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵便脊,是天一觀的道長(zhǎng)蚂四。 經(jīng)常有香客問我,道長(zhǎng)哪痰,這世上最難降的妖魔是什么遂赠? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮妒御,結(jié)果婚禮上解愤,老公的妹妹穿的比我還像新娘镇饺。我一直安慰自己乎莉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布奸笤。 她就那樣靜靜地躺著惋啃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪监右。 梳的紋絲不亂的頭發(fā)上边灭,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音健盒,去河邊找鬼绒瘦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扣癣,可吹牛的內(nèi)容都是我干的惰帽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼父虑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼该酗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤呜魄,失蹤者是張志新(化名)和其女友劉穎悔叽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爵嗅,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娇澎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了操骡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片九火。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖册招,靈堂內(nèi)的尸體忽然破棺而出岔激,到底是詐尸還是另有隱情,我是刑警寧澤是掰,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布虑鼎,位于F島的核電站,受9級(jí)特大地震影響键痛,放射性物質(zhì)發(fā)生泄漏炫彩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一絮短、第九天 我趴在偏房一處隱蔽的房頂上張望江兢。 院中可真熱鬧,春花似錦丁频、人聲如沸杉允。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叔磷。三九已至,卻和暖如春奖磁,著一層夾襖步出監(jiān)牢的瞬間改基,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工咖为, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秕狰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓躁染,卻偏偏與公主長(zhǎng)得像鸣哀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褐啡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理诺舔,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 什么是Spring Spring是一個(gè)開源的Java EE開發(fā)框架低飒。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,441評(píng)論 1 133
  • 要養(yǎng)生许昨,注意休息,學(xué)會(huì)照顧好自己褥赊,學(xué)會(huì)好好生活糕档。 我還沒有做到孝敬父母,養(yǎng)育外公外婆拌喉,還沒獨(dú)當(dāng)一面速那,我不能倒下,必...
    changgg閱讀 103評(píng)論 0 0
  • 2017年9月26日 星期二 天氣晴 前幾天我在考語文非常認(rèn)真尿背。到星期一端仰。老師把考卷發(fā)下來的時(shí)候我看到我竟然得了一...
    詩雨_137閱讀 281評(píng)論 0 2