Spring詳解

一伪窖、概述

(一)Spring框架的核心功能:

1、負(fù)責(zé)創(chuàng)建和管理所有的java對象居兆,這些java對象被稱為bean

2覆山、管理容器中Bean之間的依賴關(guān)系,以一種"依賴注入"的方式來管理Bean之間的依賴關(guān)系泥栖。(依賴注入為Bean注入普通的屬性值簇宽,也可以注入其他Bean的引用)

通俗的說,Spring框架的本質(zhì)就是通過XML配置類驅(qū)動(dòng)java代碼吧享,從而把耦合關(guān)系提取到配置文件中管理魏割,實(shí)現(xiàn)了系統(tǒng)中各組件的解耦。

(二)總結(jié)需要的:

? 創(chuàng)建spring項(xiàng)目兩種方式:

? 1.直接創(chuàng)建spring項(xiàng)目:如 另一篇文章很簡易的spring的基本使用(以及spring mvc的) - 簡書

?(1)bean包(setter钢颂、getter方法钞它,以及包括其具體的實(shí)現(xiàn)類)(2)spring.xml(spring的配置文件,主要是配置bean實(shí)例的甸陌,指定實(shí)例之間依賴關(guān)系须揣,可以建一個(gè), 其中多個(gè)bean钱豁,也可以對應(yīng)每個(gè)數(shù)據(jù)模型建多個(gè)xml文件耻卡,對應(yīng)不同的bean)或者注解(通過反射來創(chuàng)建實(shí)例) (3)spring的實(shí)現(xiàn)類

2.創(chuàng)建一個(gè)Maven項(xiàng)目:如下圖,

比起直接創(chuàng)建spring項(xiàng)目牲尺,要多一個(gè)pom.xml(自動(dòng)生成)用于配置spring



二卵酪、入門:

(一)spring框架結(jié)構(gòu):

AOP:面向切面(面向方面編程)

IOC:控制反轉(zhuǎn),容器

DI:依賴注入

(注意:spring沒有提供AOP方式的日志系統(tǒng)谤碳,我們需要使用AOP方式溃卡,借助spring與日志系統(tǒng)log4j實(shí)現(xiàn)我們自己的日志系統(tǒng))

Spring通過配置文件描述Bean及Bean之間的依賴關(guān)系,并通過Java語言的反射功能實(shí)例化Bean并建立Bean之間的依賴關(guān)系蜒简。

Spring的IOC容器瘸羡,一個(gè)是完成底層工作,并且提供一些高級服務(wù)(通過BeanFactory和ApplicationContext)

配置Bean(定義了Bean的實(shí)現(xiàn)及依賴關(guān)系)搓茬,Spring容器根據(jù)各種形式的Bean配置信息在容器內(nèi)部建立Bean定義注冊表犹赖,然后根據(jù)注冊表加載、實(shí)例化Bean卷仑,并建立bean和bean的依賴關(guān)系峻村,最后將準(zhǔn)備就緒的bean放到bean緩存池,供外岑的應(yīng)用程序調(diào)用锡凝。


(二)入門示例:

用的是Maven項(xiàng)目結(jié)構(gòu)來創(chuàng)建spring項(xiàng)目:

1.eclipse創(chuàng)建maven項(xiàng)目:

注意創(chuàng)建路徑不能和其他java項(xiàng)目路徑一致粘昨,干脆在D盤另開一個(gè)文件夾。


項(xiàng)目目錄

2.用maven,對單個(gè)項(xiàng)目右鍵propeties更改默認(rèn)設(shè)置java1.8:

3. 配置pom.xml张肾,聲明spring基本庫:

配置前:

配置后:

4.這個(gè)例子中有點(diǎn)類似spring基礎(chǔ)的例子芭析,同樣還是在applicationConfig.xml配置文件中配置java bean,在主類中用ApplicationContext獲取這個(gè)xml吞瞪。

(三)Maven中pom.xml中配置spring和數(shù)據(jù)庫(oracle,mysql,sql server):



三放刨、Spring的核心機(jī)制:依賴注入

依賴注入(DI)通常有兩種:

1、設(shè)值注入:IOC容器使用成員變量的setter方法來注入被依賴對象

通過<property.../>元素驅(qū)動(dòng)spring執(zhí)行setter方法

推薦面向接口編程尸饺,更好使規(guī)范和實(shí)現(xiàn)分離,提供更好的解耦助币。無論DAO組件或者業(yè)務(wù)邏輯組件浪听,都應(yīng)該先定義一個(gè)接口,定義該組件應(yīng)該實(shí)現(xiàn)的功能眉菱,但具體實(shí)現(xiàn)由實(shí)現(xiàn)類提供迹栓。

A調(diào)用B,B調(diào)用C...這其實(shí)就是依賴關(guān)系俭缓。但spring是以松耦合的方式來管理這種調(diào)用關(guān)系克伊。

配置文件:配置Bean實(shí)例,通常指定id华坦、class愿吹、ref屬性

需要:接口類、實(shí)現(xiàn)類惜姐、spring的配置文件xxx.xml(配置Bean犁跪,指定實(shí)例之間的依賴關(guān)系)、spring容器的實(shí)現(xiàn)類

2歹袁、構(gòu)造注入:IOC容器使用構(gòu)造器來注入被依賴對象坷衍,通過構(gòu)造方法

在配置文件中使用元素指定構(gòu)造器的參數(shù),通過<constructor-arg.../>元素驅(qū)動(dòng)spring執(zhí)行帶參數(shù)的構(gòu)造器条舔。


四枫耳、使用spring容器:(一般使用ApplicationContext作為spring容器,所以spring容器也稱為spring上下文)

(一)Spring的兩個(gè)核心接口:BeanFactory和ApplicationContext

(區(qū)別:BeanFactory等到程序需要Bean實(shí)例是才創(chuàng)建bean孟抗;ApplicationContext在創(chuàng)建容器實(shí)例時(shí)就預(yù)初始化所有singleton Bean)

1迁杨、BeanFactory:IOC容器,是Spring框架的基礎(chǔ)設(shè)施夸浅,面向spring本身仑最,提供了高級IOC的配置機(jī)制。負(fù)責(zé)配置帆喇、創(chuàng)建警医、管理Bean,但很少用BeanFactory實(shí)例來作Spring的容器。

(主要方法:初始化配置Bean预皇,再通過getBean()獲取bean實(shí)例)侈玄,初始化時(shí)必須為其提供一種日志框架,Log4J)

包含:Object getBean(Sring id)吟温、

? ? ? ? ? T getBean(String name,Class?requiredType)序仙、

? ? ? ? ? ?getType()方法


2、ApplicationContext:是BeanFactory的子接口鲁豪,用于創(chuàng)建beanFactory的實(shí)例潘悼。一般用在spring的實(shí)現(xiàn)類中,作為用于訪問容器中的bean常用接口(Spring容器爬橡,應(yīng)用上下文治唤,面向使用spring框架的開發(fā)者)常用!2谏辍1鎏怼!

其實(shí)現(xiàn)類:

(1)ClassPathXmlApplicationContext類:從類路徑加載配置文件(較穩(wěn)定柜裸,常使用)

【ApplicationContext context =new ClassPathXmlApplicationContext(“xxx.xml”);

Person p=context.getBean("person",Person.CLass)】

(2)FileSystemXmlApplicationContext類:從文件系統(tǒng)裝載配置文件

【ApplicationContext context =new FileSystemXmlApplicationContextxml(“xxx.xml”);】

(3)AnnotationConfigApplicationContext類

(4)WebXmlApplicationContext:定義了一個(gè)WEB應(yīng)用的所有bean缕陕。?


(二)spring獲取bean對象的方法:在ApplicationContext接口的實(shí)現(xiàn)類中使用

(1)Object getBean(Sring id)由容器中Bean的id獲取指定bean

(2)T getBean(String name,Class requiredType)由容器中Beanid獲取


五、Spring容器中的Bean:

1疙挺、bean的基本定義和別名:

根元素:<beans>扛邑,其中可以包含多個(gè)<bean.../>子元素,每個(gè)子元素定義一個(gè)Bean铐然,每個(gè)Bean又對應(yīng)Spring容器里的一個(gè)JAVA實(shí)例鹿榜。

定義Bean一般要指定2個(gè)屬性:id、class锦爵,還有name(可設(shè)置多個(gè))

而元素<alias../>可指定別名:有兩個(gè)屬性:name和alias

2舱殿、容器中bean的作用域:6個(gè)(p569)

常用:singleton(只產(chǎn)生一個(gè)實(shí)例,默認(rèn)险掀,一旦創(chuàng)建成功可以重復(fù)使用)沪袭、prototype(每次都產(chǎn)生一個(gè)新的bean實(shí)例,從內(nèi)存申請角度應(yīng)盡量避免設(shè)置)樟氢、

web應(yīng)用中的:request冈绊、session、application埠啃、websocket(這四個(gè)只在web應(yīng)用中生效死宣,所以必須要在web.xml中增加額外配置,如listener配置

<listener>

<listener-class>org.springframework.web.content.request.RequestContextListener</listener-class>

</listener>

因?yàn)槭窃趙eb應(yīng)用中的碴开,所以一般是在jsp中獲取毅该,在jsp中用java代碼獲取spring容器:WebApplicationContext??

也可直接使用springMVC框架博秫。

3、配置依賴:

配置<bean>元素眶掌,相當(dāng)于創(chuàng)建一個(gè)java實(shí)例挡育;

在<bean>元素中配置<property>子元素,相當(dāng)于bean類中的屬性朴爬,每包含一個(gè)<property>子元素即寒,spring則為該bean實(shí)例調(diào)用一次setter方法。

并在實(shí)現(xiàn)類中運(yùn)用反射實(shí)現(xiàn)召噩。

<property>中的屬性:

(1)value:設(shè)置普通屬性值

<property name="屬性名"? value="屬性值"/>

?(2)引用容器中其他bean:<ref.../>

(3)? 自動(dòng)裝配屬性:autowire母赵、default-autowire

其可接收如下值:no、byName(根據(jù)setter方法名與bean的id進(jìn)行匹配具滴,spring容器會(huì)根據(jù)該bean的setter方法名尋找容器中id為同盟的bean市咽,將其作為調(diào)用該setter方法的參數(shù);找不到則不進(jìn)行任何注入)抵蚊、byType(同理,但這是根據(jù)setter方法的參數(shù)類型與bean的類型進(jìn)行匹配溯革,若有多個(gè)匹配贞绳,容器會(huì)無法判斷,從而拋出異常致稀;找不到則不進(jìn)行任何注入)冈闭、constructor(類似byType,但找不到則拋出異常)抖单、autodetect(根據(jù)bean內(nèi)部結(jié)構(gòu)決定使用constructor或byType策略萎攒,?首先嘗試使用constructor來自動(dòng)裝配,如果無法工作矛绘,則使用byType方式耍休。)

(4)注入嵌套bean:把<bean>配置成<property.../>或<costructor-args.../>的子元素

總結(jié):spring配置文件,根據(jù)傳入?yún)?shù)的參數(shù)類型不同货矮,配置文件不同

①基本類型羊精,在value寫值;②其他類時(shí):用ref的方式囚玫;注入嵌套喧锦;自動(dòng)裝配?

③注入集合值:map、list抓督、set燃少、properties(key、value只能說字符串)

六铃在、spring中配置bean的xml(applicationConfig.xml):

基于xml文件配置阵具,三種方式注入bean屬性:

舉例:一個(gè)java類碍遍,有name和type屬性

1.正常方式:在一個(gè)“value”標(biāo)簽注入值,并附有“property”標(biāo)簽結(jié)束怔昨。

2.快捷方式:注入值“value”屬性雀久。

3."p"模式:通過使用“p”模式作為注入值到一個(gè)屬性。

并且趁舀,

七赖捌、類注解的配置方式

在實(shí)體類:

@configuration在類前注解:表示是一個(gè)配置信息提供類

@Bean(name=“xxx”):定義一個(gè)bean

@Value:修飾,設(shè)定值

@SuppressWarnings("serial"):實(shí)現(xiàn)序列化接口矮烹,對實(shí)體類進(jìn)行標(biāo)注

則實(shí)例化Bean越庇,啟動(dòng)IOC容器并裝配Bean如下:

ApplicationContext ctx=new AnnotationConfigApplicationContext(Beans.class)


bean實(shí)現(xiàn)類:

@Component(基本注解。標(biāo)注基本類)或其他衍型類奉狈,如

@Repository:用于對DAO實(shí)現(xiàn)類進(jìn)行標(biāo)注:@Repository對應(yīng)數(shù)據(jù)訪問層Bean

@Repository(value="userDao")注解是告訴Spring卤唉,讓Spring創(chuàng)建一個(gè)名字叫“userDao”的UserDaoImpl實(shí)例。


業(yè)務(wù)層:

@Service:用于對service業(yè)務(wù)層實(shí)現(xiàn)類進(jìn)行標(biāo)注仁期,聲明spring要?jiǎng)?chuàng)建的bean


控制層:

@Controller:對controller實(shí)現(xiàn)類進(jìn)行標(biāo)注桑驱,說明action的名字

在成員變量或方法入?yún)⑻帢?biāo)注@Autowird(按類型匹配自動(dòng)注入),或者配合使用@Qualifer(按名稱匹配方式注入)

@Scope注解:@Scope("prototype")表示將Action的范圍聲明為原型跛蛋,可以利用容器的scope="prototype"來保證每一個(gè)請求有一個(gè)單獨(dú)的Action來處理熬的,避免struts中Action的線程安全問題。spring?默認(rèn)scope?是單例模式

@RequestMapping:說明action的路徑赊级,用于類上或者方法上押框,在類上可以不用,但在方法上必須使用

@Responsebody 注解:表示該方法的返回的結(jié)果直接寫入 HTTP 響應(yīng)正文(ResponseBody)中理逊,一般在異步獲取數(shù)據(jù)時(shí)使用橡伞,通常是在使用 @RequestMapping 后,返回值通常解析為跳轉(zhuǎn)路徑晋被,加上 @Responsebody 后返回結(jié)果不會(huì)被解析為跳轉(zhuǎn)路徑兑徘,而是直接寫入HTTP 響應(yīng)正文中。?


另外:@Autowired的用法和作用:它可以對類成員變量羡洛、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注道媚,完成自動(dòng)裝配的工作

這個(gè)注解就是spring可以自動(dòng)幫你把bean里面引用的對象的setter/getter方法省略,它會(huì)自動(dòng)幫你set/get翘县。

這樣你在userService里面要做一個(gè)userDao的setter/getter方法最域。

但如果你用了@Autowired的話,你只需要在UserService的實(shí)現(xiàn)類中聲明即可锈麸。

@Autowired

private IUserDao userdao;

Spring@Autowired注解與自動(dòng)裝配


八镀脂、創(chuàng)建bean的三種方式:

1、通過構(gòu)造器創(chuàng)建bean實(shí)例:在<bean.../>元素中添加<constructor-arg.../>子元素忘伞,配置構(gòu)造器參數(shù)

2薄翅、靜態(tài)工廠方法創(chuàng)建(P589)

3沙兰、實(shí)例工廠方法創(chuàng)建(P591)



九、web.xml中配置字符編碼過濾器

十翘魄、session作用域和request作用域類似:request作用域的bean對于每次http請求有效鼎天,而session作用域的Bean則對于每次http session有效

在web.xml中增加Listener配置,程序可以在spring配置文件中使用request/session作用域 scope="request"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末暑竟,一起剝皮案震驚了整個(gè)濱河市斋射,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌但荤,老刑警劉巖罗岖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腹躁,居然都是意外死亡桑包,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門纺非,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哑了,“玉大人,你說我怎么就攤上這事烧颖∪踝螅” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵倒信,是天一觀的道長。 經(jīng)常有香客問我泳梆,道長鳖悠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任优妙,我火速辦了婚禮乘综,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘套硼。我一直安慰自己卡辰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布邪意。 她就那樣靜靜地躺著九妈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雾鬼。 梳的紋絲不亂的頭發(fā)上萌朱,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機(jī)與錄音策菜,去河邊找鬼晶疼。 笑死酒贬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翠霍。 我是一名探鬼主播锭吨,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寒匙!你這毒婦竟也來了零如?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤蒋情,失蹤者是張志新(化名)和其女友劉穎埠况,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棵癣,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辕翰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狈谊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喜命。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖河劝,靈堂內(nèi)的尸體忽然破棺而出壁榕,到底是詐尸還是另有隱情,我是刑警寧澤赎瞎,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布牌里,位于F島的核電站,受9級特大地震影響务甥,放射性物質(zhì)發(fā)生泄漏牡辽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一敞临、第九天 我趴在偏房一處隱蔽的房頂上張望态辛。 院中可真熱鬧,春花似錦挺尿、人聲如沸奏黑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熟史。三九已至,卻和暖如春窄俏,著一層夾襖步出監(jiān)牢的瞬間以故,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工裆操, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怒详,地道東北人炉媒。 一個(gè)月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像昆烁,于是被迫代替她去往敵國和親吊骤。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

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