title: Spring————程序員的春天
tags: Spring
categories: Spring
若圖片無(wú)法顯示父能,請(qǐng)前往我的博客查看客峭,相應(yīng)文章鏈接:http://codingxiaxw.cn/2016/11/11/39-Spring/
當(dāng)客戶端向服務(wù)器發(fā)出請(qǐng)求時(shí)鉴扫,服務(wù)器把得到的請(qǐng)求發(fā)送給控制器Servlet零渐,而在Servlet中需要?jiǎng)?chuàng)建Service對(duì)象來(lái)調(diào)用業(yè)務(wù)層相關(guān)功能(故說(shuō)控制器層Servlet依賴于業(yè)務(wù)層Service),而在Service中又需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)層DAO對(duì)象來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作(故說(shuō)業(yè)務(wù)層Service依賴于數(shù)據(jù)庫(kù)層DAO)嘶伟。
思考:針對(duì)上述過(guò)程工腋,我們需要考慮這樣幾個(gè)問(wèn)題展鸡。1.Servlet屿衅、Service以及Dao對(duì)象的創(chuàng)建時(shí)間、創(chuàng)建數(shù)量莹弊。2.Servlet涤久、Service以及Dao之間的依賴關(guān)系。如何處理這些問(wèn)題呢忍弛?Spring就是用來(lái)處理對(duì)象的創(chuàng)建响迂、以及對(duì)象之間依賴關(guān)系的一個(gè)開(kāi)發(fā)框架。它打破了我們傳統(tǒng)開(kāi)發(fā)的觀念剧罩,我們不再需要像以前那樣在具體的類中創(chuàng)建具體的對(duì)象栓拜,而是將對(duì)象的創(chuàng)建交給它去完成。它是我們所要學(xué)習(xí)的框架中最重要的框架惠昔,請(qǐng)務(wù)必好好學(xué)習(xí)幕与。
1.Spring框架中的專業(yè)術(shù)語(yǔ)
1.1組件/框架設(shè)計(jì)
- 侵入式設(shè)計(jì):對(duì)現(xiàn)有類的結(jié)構(gòu)有影響,即需要實(shí)現(xiàn)或繼承某些特定類镇防。 如Struts框架啦鸣。
- 非侵入式設(shè)計(jì):引入了框架,對(duì)現(xiàn)有的類結(jié)構(gòu)沒(méi)有影響来氧。如Spring框架/Hibernate框架诫给。
1.2控制反轉(zhuǎn)
Inversion On Control,簡(jiǎn)稱IOC啦扬。對(duì)象的創(chuàng)建交給外部容器自動(dòng)完成中狂,這個(gè)就叫做控制反轉(zhuǎn)。(有控制反轉(zhuǎn)就有控制正轉(zhuǎn)扑毡,控制正轉(zhuǎn):對(duì)象的創(chuàng)建由我們自己創(chuàng)建)
依賴注入dependency injection,簡(jiǎn)稱DI胃榕,用于處理對(duì)象間的依賴關(guān)系。
二者區(qū)別:控制反轉(zhuǎn)(IOC):解決對(duì)象創(chuàng)建的問(wèn)題瞄摊,(對(duì)象的創(chuàng)建交給別人)勋又。依賴注入(DI):在創(chuàng)建完對(duì)象后苦掘,對(duì)象關(guān)系的處理就是依賴注入,(通過(guò)set方法依賴注入楔壤。)
1.3AOP
面向切面編程鹤啡。切面,簡(jiǎn)單來(lái)說(shuō)可以理解為一個(gè)類蹲嚣,由很多重復(fù)代碼形成的類递瑰。切面舉例:事務(wù)、日志隙畜、權(quán)限泣矛。 關(guān)于AOP的詳細(xì)講解我推薦你們看這篇博客:Spring AOP實(shí)現(xiàn)原理與應(yīng)用 ,往后我會(huì)單獨(dú)寫(xiě)篇博客為你們?cè)敿?xì)介紹AOP禾蚕。
2.Spring框架概述
Spring框架,可以解決對(duì)象創(chuàng)建以及對(duì)象之間依賴關(guān)系的一種框架狂丝。且可以和其它框架一起使用换淆,例如spring與struts、spring和hibernate几颜。(起到整合/粘合作用的一個(gè)框架)倍试。
spring提供了一站式解決方案:
1)SpringCore:是Spring的核心功能:IOC容器,解決對(duì)象創(chuàng)建及依賴關(guān)系蛋哭。
2)SpringWeb:Spring對(duì)web模塊的支持县习。
可以與struts整合,讓struts的action創(chuàng)建交給spring谆趾。
Spring mvc模式躁愿,用springmvc整合了就不用struts了。
3)Spring DAO:是Spring對(duì)Jdbc操作的支持沪蓬。(Jdbc Template模塊工具類)
4)Spring ORM:是Spring對(duì)ORM的支持彤钟。
既可以與hibernate整合(使用原始的session)
也可以使用Spring對(duì)Hibernate操作的封裝(對(duì)上面的session又進(jìn)行了一層封裝)
5)Spring AOP:關(guān)于AOP的詳細(xì)講解我推薦你們看這篇博客:Spring AOP實(shí)現(xiàn)原理與應(yīng)用 ,往后我會(huì)單獨(dú)寫(xiě)篇博客為你們?cè)敿?xì)介紹AOP跷叉。
6)SpringEE:Spring對(duì)javaEE其它模塊的支持
3.Spring開(kāi)發(fā)步驟
1)導(dǎo)入jar包:
[圖片上傳失敗...(image-b4a912-1526379695715)]
寫(xiě)在前面的話:當(dāng)你運(yùn)行程序出現(xiàn)org.springframework.beans.factory.BeanDefinitionStoreException
的報(bào)錯(cuò)信息時(shí)逸雹,不要想了,出現(xiàn)這種報(bào)錯(cuò)的信息原因絕對(duì)是因?yàn)閖dk版本和你導(dǎo)入的spring jar包不兼容的問(wèn)題云挟。由于spring3.x與jdk1.7兼容梆砸,而spring4.x與jdk1.8兼容,所以這里提供兩種解決方案:
- 1.將jdk版本調(diào)為1.7园欣,我用的開(kāi)發(fā)工具為IDEA帖世,它默認(rèn)下的JDK使用1.8版本,所以我需要在三個(gè)地方將jdk的版本改過(guò)來(lái)(前提是你已經(jīng)下載了jdk1.7版本)俊庇,修改IDEA配置中Project的jdk版本狮暑、Modules的jdk版本鸡挠、SDKs的版本,如果你用到leTomcat還需要修改Tomcat配置的jdk版本搬男。這樣jdk1.7與spring3.x才兼容拣展。
- 2.將spring3.x.jar換成spring4.x.jar包。這種方式比較繁瑣缔逛,建議大家使用第一種方式备埃。spring4.x與jdk1.8才兼容。
2)配置核心文件applicationContext.xml(文件名稱隨意):
[圖片上傳失敗...(image-7a1797-1526379695715)]
代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
3)使用:
首先我們創(chuàng)建一個(gè)pojo對(duì)象User.java:
[圖片上傳失敗...(image-2f351-1526379695715)]
然后創(chuàng)建測(cè)試類使用這個(gè)User對(duì)象褐奴,以前我們要使用User對(duì)象時(shí)直接像這樣User user=new User();
new一個(gè)對(duì)象即可:[圖片上傳失敗...(image-5b08e6-1526379695715)]
而當(dāng)我們使用Spring后就應(yīng)該這樣使用User對(duì)象按脚,首先在applicationContext.xml中添加<bean>
標(biāo)簽,一個(gè)<bean>
標(biāo)簽代表一個(gè)pojo對(duì)象:
[圖片上傳失敗...(image-46d4bd-1526379695715)]
其中各個(gè)屬性的說(shuō)明見(jiàn)注釋敦冬。然后我們通過(guò)如下步驟獲取該pojo對(duì)象:
[圖片上傳失敗...(image-ddfc39-1526379695715)]
運(yùn)行測(cè)試類:[圖片上傳失敗...(image-fdb87e-1526379695715)]
說(shuō)明成功獲取到User對(duì)象辅搬。上述是通過(guò)工廠類獲取的IOC容器創(chuàng)建的User對(duì)象,下面我們看看使用Spring框架獲取pojo對(duì)象的第二種方式直接得到IOC容器的對(duì)象:
[圖片上傳失敗...(image-535e45-1526379695715)]
運(yùn)行程序脖旱,成功打印出user信息堪遂,說(shuō)明我們通過(guò)IOC容器成功獲取到user對(duì)象。
4.<bean>
創(chuàng)建的細(xì)節(jié)
對(duì)上述代碼進(jìn)行改進(jìn)萌庆,對(duì)于IOC容器對(duì)象溶褪,我們只需創(chuàng)建一次即可,所以將創(chuàng)建IOC對(duì)象的代碼改為成員變量践险。
[圖片上傳失敗...(image-3f4ace-1526379695716)]
代碼中我們通過(guò)IOC對(duì)象創(chuàng)建了兩個(gè)User對(duì)象猿妈,運(yùn)行測(cè)試類得到打印結(jié)果:[圖片上傳失敗...(image-fdbf2a-1526379695716)]
發(fā)現(xiàn)答應(yīng)的這兩個(gè)User對(duì)象id都一樣,說(shuō)明我們獲取到的是同一個(gè)對(duì)象巍虫,也說(shuō)明通過(guò)<bean>
標(biāo)簽設(shè)置的pojo對(duì)象是單例的彭则。為什么呢?其實(shí)<bean>
標(biāo)簽?zāi)J(rèn)有一個(gè)scope="singleton"
的屬性垫言,代表該<bean
標(biāo)簽對(duì)象的pojo對(duì)象是單例的贰剥。我們可以將該屬性值改為scope="prototype"
,如下:[圖片上傳失敗...(image-1248f9-1526379695716)]
然后再運(yùn)行測(cè)試類,輸出如下內(nèi)容:
[圖片上傳失敗...(image-ca28d3-1526379695716)]
說(shuō)明此時(shí)獲取的兩個(gè)User不再是同一個(gè)對(duì)象筷频。
那么由IOC容器管理的pojo對(duì)象應(yīng)該在何時(shí)創(chuàng)建呢蚌成?我們來(lái)看看,首先在User.java中添加一個(gè)無(wú)參構(gòu)造器:[圖片上傳失敗...(image-de5439-1526379695716)]
然后修改測(cè)試類:[圖片上傳失敗...(image-414035-1526379695716)]
運(yùn)行測(cè)試類:[圖片上傳失敗...(image-83cb7c-1526379695716)]
從控制臺(tái)中輸出內(nèi)容我們可以得知:當(dāng)程序運(yùn)行時(shí)凛捏,IOC容器首先創(chuàng)建担忧,然后當(dāng)我們需要得到IOC容器中的pojo對(duì)象時(shí)我們通過(guò)語(yǔ)句ac.getBean("user");
得到,此時(shí)就會(huì)在IOC中創(chuàng)建由它管理的pojo對(duì)象坯癣。當(dāng)我們刪除ac.getBean("user");
語(yǔ)句時(shí)瓶盛,再次運(yùn)行程序,得到如下內(nèi)容:[圖片上傳失敗...(image-fa6230-1526379695716)]
這說(shuō)明什么呢?說(shuō)明IOC容器中沒(méi)有創(chuàng)建pojo對(duì)象(因?yàn)橐坏﹦?chuàng)建就會(huì)有"---User對(duì)象創(chuàng)建---"的語(yǔ)句輸出)。綜上情況惩猫,即只有當(dāng)我們用到pojo對(duì)象時(shí)芝硬,IOC容器才會(huì)在自己內(nèi)部創(chuàng)建它。此種情況為<bean>
標(biāo)簽的屬性為scope="prototype"
的結(jié)果轧房,那么我們?cè)賮?lái)看看當(dāng)屬性為scope="singleton"
時(shí)的輸出結(jié)果為:[圖片上傳失敗...(image-d82575-1526379695716)]
打印臺(tái)的內(nèi)容說(shuō)明該User對(duì)象在程序啟動(dòng)時(shí)就創(chuàng)建在IOC容器中了拌阴,不信我們把通過(guò)IOC容器得到User對(duì)象的代碼注釋掉再看輸出結(jié)果:[圖片上傳失敗...(image-10be2e-1526379695716)]
發(fā)現(xiàn)此時(shí)即使我們不通過(guò)ac.getBean("user");
語(yǔ)句得到User對(duì)象,它也在程序啟動(dòng)時(shí)就創(chuàng)建了奶镶。
總結(jié):在<bean>
標(biāo)簽中設(shè)置bean對(duì)象為單例時(shí)迟赃,該對(duì)象在系統(tǒng)啟動(dòng)時(shí)就會(huì)創(chuàng)建;設(shè)置為多例時(shí)厂镇,該對(duì)象在我們需要使用時(shí)才創(chuàng)建纤壁。
4.1<bean>
標(biāo)簽中的其它屬性說(shuō)明
- 1.
lazy-init:
延遲初始化bean對(duì)象,默認(rèn)值為false捺信,即不延遲創(chuàng)建bean對(duì)象酌媒,在程序啟動(dòng)時(shí)就在IOC中創(chuàng)建bean對(duì)象;若其值為true則延遲創(chuàng)建bean對(duì)象迄靠,即在我們需要對(duì)象時(shí)才在IOC容器中創(chuàng)建該對(duì)象馍佑。此屬性只對(duì)單例bean對(duì)象有效。 - 2.
init-method:
可以給該屬性傳遞一個(gè)在pojo對(duì)象中創(chuàng)建的方法例如A方法的方法名A作為init-method的屬性值梨水,表示當(dāng)該pojo對(duì)象在IOC容器中被創(chuàng)建后就立刻執(zhí)行這個(gè)A方法。 - 3.
destoy-method:
同上茵臭,給該屬性傳遞一個(gè)在pojo對(duì)象中創(chuàng)建的方法例如B方法的方法名B作為destoy-method的屬性值疫诽,表示當(dāng)IOC容器被銷毀時(shí)(該pojo對(duì)象也會(huì)在IOC中銷毀)會(huì)立刻調(diào)用這個(gè)B方法。當(dāng)然我們通過(guò)ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
創(chuàng)建的IOC對(duì)象ac是沒(méi)有destoy()方法的旦委,我們需要這個(gè)創(chuàng)建IOC對(duì)象ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
這樣創(chuàng)建出來(lái)的IOC對(duì)象才有destoy()方法奇徒。
5.Spring IOC容器
Spring IOC容器,是Spring的核心內(nèi)容缨硝,用于創(chuàng)建對(duì)象和處理對(duì)象間的依賴關(guān)系摩钙。
5.1對(duì)象的創(chuàng)建
利用IOC容器創(chuàng)建對(duì)象的方式有如下幾種:1.調(diào)用無(wú)參數(shù)構(gòu)造器。2.調(diào)用帶參數(shù)構(gòu)造器查辩。3.工廠創(chuàng)建對(duì)象胖笛。包括工廠類的靜態(tài)方法創(chuàng)建對(duì)象和工廠類的非靜態(tài)方法創(chuàng)建對(duì)象4.反射。(IOC的原理就是通過(guò)反射來(lái)創(chuàng)建對(duì)象)
5.1.1調(diào)用無(wú)參數(shù)構(gòu)造器
在配置文件中加入如下內(nèi)容:[圖片上傳失敗...(image-8b27a1-1526379695716)]
5.1.2調(diào)用帶參數(shù)構(gòu)造器
[圖片上傳失敗...(image-eae437-1526379695716)]
<constructor-arg>
標(biāo)簽中還有一個(gè)ref的屬性宜岛,屬性值代表引用配置文件(即IOC容器)中的相應(yīng)對(duì)象长踊。
故還可以采用這種方法調(diào)用帶參數(shù)構(gòu)造器創(chuàng)建對(duì)象:[圖片上傳失敗...(image-9f1284-1526379695716)]
5.1.3工廠創(chuàng)建對(duì)象
首先創(chuàng)建一個(gè)工廠類: [圖片上傳失敗...(image-87b97a-1526379695716)]
調(diào)用工廠的實(shí)例方法創(chuàng)建對(duì)象:[圖片上傳失敗...(image-bc49d8-1526379695716)]
調(diào)用工廠靜態(tài)方法創(chuàng)建對(duì)象:[圖片上傳失敗...(image-4aa7cd-1526379695716)]
5.2處理對(duì)象的依賴關(guān)系
在IOC容器的配置文件中我們有如下給對(duì)象注入屬性的方法:1.通過(guò)構(gòu)造方法。2.通過(guò)set方法給屬性注入值萍倡。3.p名稱空間身弊。4.自動(dòng)裝配。5.注解。
5.2.1通過(guò)構(gòu)造方法
首先我們來(lái)看看如何通過(guò)構(gòu)造方法來(lái)給對(duì)象的屬性賦值,在配置文件中添加如下標(biāo)簽即可通過(guò)構(gòu)造器給該User對(duì)象的屬性賦值:
[圖片上傳失敗...(image-b68d3c-1526379695716)]
5.2.2通過(guò)set方法
通過(guò)set方法給屬性賦值,前提是在User對(duì)象中給它的屬性添加了set方法:
[圖片上傳失敗...(image-e26906-1526379695716)]
接下來(lái)我們看個(gè)案例阱佛,以前我們開(kāi)發(fā)時(shí)根據(jù)MVC模式都會(huì)像下面這樣建立相應(yīng)的Service.java帖汞、Servlet.java和dao.java:[圖片上傳失敗...(image-eee4f4-1526379695716)]
[圖片上傳失敗...(image-8c08a3-1526379695716)]
[圖片上傳失敗...(image-1f7faa-1526379695716)]
都需要我們自己在.java文件中添加A a=new A();
來(lái)創(chuàng)建其所需要的依賴對(duì)象,而現(xiàn)在我們就將對(duì)象的創(chuàng)建交給IOC了凑术,選擇set給屬性賦值的方式來(lái)給它們注入其所需依賴對(duì)象翩蘸,修改它們的代碼:
[圖片上傳失敗...(image-38602c-1526379695716)]
[圖片上傳失敗...(image-92bdb4-1526379695716)]
然后我們需要在application.xml中進(jìn)行配置:[圖片上傳失敗...(image-4752a3-1526379695716)]
ref的屬性值代表給該對(duì)象注入它所依賴的對(duì)象,即我們上述講到的依賴注入(dependency injection),通過(guò)上述步驟我們便完成了將對(duì)象的創(chuàng)建交給IOC的操作麦萤。
上述三個(gè)對(duì)象的創(chuàng)建我們需要寫(xiě)三個(gè)<bean>
標(biāo)簽才能完成鹿鳖,接下來(lái)我將介紹第二種方法通過(guò)內(nèi)部bean的操作一次性完成它們的創(chuàng)建以及它們之間的依賴關(guān)系,修改配置文件中的內(nèi)容:
[圖片上傳失敗...(image-bf581-1526379695716)]
通過(guò)上述內(nèi)部<bean>
標(biāo)簽的方式我們便可實(shí)現(xiàn)和set注入依賴相同的效果壮莹。我們來(lái)看看它們兩者的相同和區(qū)別:
- 相同:都可以創(chuàng)建Service對(duì)象翅帜,并處理了之間的依賴關(guān)系。
- 區(qū)別:set注入創(chuàng)建的Service對(duì)象可以給另一個(gè)Servlet對(duì)象調(diào)用命满,而內(nèi)部bean將Service對(duì)象寫(xiě)在Servlet內(nèi)部導(dǎo)致該Service對(duì)象只能被該Servlet使用涝滴,所以內(nèi)部bean標(biāo)簽的使用場(chǎng)景在只需要一個(gè)Servlet對(duì)象的項(xiàng)目中。
5.2.3通過(guò)p名稱空間給對(duì)象的屬性注入值
此中方法只有在Spring3.0版本及以上版本才能用胶台。首先在配置文件的<beans>
根標(biāo)簽中加入屬性:xmlns:p="http://www.springframework.org/schema/p"
歼疮。然后我們便可以在配置文件中這樣給對(duì)象的屬性賦值:[圖片上傳失敗...(image-7b6a48-1526379695716)]
當(dāng)我們?cè)谂渲梦募休斎?code>p:時(shí),會(huì)出現(xiàn)兩個(gè)屬性1.p:userDao 和p:userDao-ref
,這里有必要說(shuō)明一下二者區(qū)別:
- p:userDao:代表直接給UserService對(duì)象的userDao屬性賦值
- p:userDao-ref:代表引用的userDao對(duì)象
例如使用p名稱空間給傳統(tǒng)的對(duì)象屬性賦值時(shí)我們這樣寫(xiě):
<bean id="user" class="pojo.User" p:id="xxx"/>
<bean id="user" class="pojo.User" p:name="xxx"/>
5.2.4.自動(dòng)裝配
當(dāng)我們?cè)谂渲梦募杏?code><bean>標(biāo)簽指明相應(yīng)對(duì)象的同時(shí)就將這個(gè)對(duì)象放入到了IOC容器中(其中標(biāo)簽中的id屬性唯一指示一個(gè)對(duì)象)诈唬,當(dāng)我們給該bean標(biāo)簽添加了autowrite="byName"
的屬性后韩脏,對(duì)于該標(biāo)簽對(duì)應(yīng)的對(duì)象注入的屬性,會(huì)去IOC容器中自動(dòng)查找與屬性同名的對(duì)象铸磅。
例如如下代碼:[圖片上傳失敗...(image-9a7503-1526379695716)]
通過(guò)上述三個(gè)<bean>
標(biāo)簽我們就將userDao赡矢、userService、userServlet三個(gè)對(duì)象添加到了IOC容器中阅仔。我們?cè)赨serService對(duì)象的bean標(biāo)簽中加上了autowrite="byName"
的屬性吹散,這樣我們查看UserService.java的代碼,它有一個(gè)UserDao對(duì)象名為userDao的屬性八酒,此時(shí)就會(huì)自動(dòng)去IOC容器中尋找與userDao
同名的對(duì)象(即在bean標(biāo)簽中尋找id為userDao的對(duì)象)空民,然后進(jìn)行注入,此時(shí)我們?nèi)魧?code><bean id="userDao" class="pojo.UserDao">的id="userDao"
屬性值改為userDao1或者其它名字羞迷,則運(yùn)行系統(tǒng)會(huì)出現(xiàn)空指針異常界轩,道理上述已分析。UserServlet注入userService的屬性道理同此衔瓮。
我們也可以將該屬性定義到全局<beans>
標(biāo)簽中耸棒,設(shè)置default-autowrite="byName"
的屬性,這樣就不用每個(gè)bean標(biāo)簽中都寫(xiě)上autowrite="byName"
屬性了。
上述是根據(jù)名稱自動(dòng)裝配报辱,其實(shí)autowrite的屬性值還可以為byType即根據(jù)類型自動(dòng)裝配与殃。對(duì)于<bean id="userService" class="pojo.UserService">
单山,當(dāng)添加了autowrity="byType"
的屬性后,此時(shí)尋找它依賴的屬性u(píng)serDao的過(guò)程如下:查看UserService.java代碼幅疼,它需要注入的屬性類型為UserDao類型米奸,所以就會(huì)自動(dòng)去IOC容器中查找UserDao類型的對(duì)象并自動(dòng)為UserService對(duì)象注入該屬性,此時(shí)各bean標(biāo)簽的id屬性值便可以隨便寫(xiě)了如果根據(jù)類型自動(dòng)裝配爽篷,則要保證保證該類型的對(duì)象只有一個(gè)悴晰,否則會(huì)報(bào)錯(cuò)。該屬性同樣可以在全局beans標(biāo)簽中進(jìn)行配置逐工。
利用自動(dòng)裝配的優(yōu)缺點(diǎn):簡(jiǎn)化了配置铡溪,但不利用系統(tǒng)維護(hù)。所以一般不推薦此中用法泪喊,下面我們?cè)賮?lái)介紹第5中非常簡(jiǎn)單的配置棕硫。
5.2.5注解
注解方式可以簡(jiǎn)化Spring的IOC容器的配置。
使用步驟:
- 1.先引入context名稱空間
- 2.開(kāi)啟注解掃描
- 3.使用注解:通過(guò)注解的方式袒啼,把對(duì)象加入到IOC容器中哈扮。
首先在IOC配置文件中引入context名稱空間,即在<beans>
全局標(biāo)簽中添加xmlns:context="http://www.springframework.org/schema/context"
屬性。
然后在配置文件中添加如下標(biāo)簽[圖片上傳失敗...(image-e5ff0a-1526379695716)]
base-package:表示該掃描器只掃描此包下所有類蚓再。
最后我們便可以使用注解了滑肉,在pojo對(duì)象的.java文件中分別加入如下注解:[圖片上傳失敗...(image-edf2eb-1526379695716)]
[圖片上傳失敗...(image-2f61c0-1526379695716)]
[圖片上傳失敗...(image-9bcaa9-1526379695716)]
@Componet注解:代表將該對(duì)象放入到IOC容器中,括號(hào)里面的名字代表該對(duì)象在IOC容器中的唯一標(biāo)識(shí)名字摘仅,名字任意取靶庙。該注解寫(xiě)在代碼第一行。
@Resource注解:用于將該對(duì)象依賴的屬性從IOC容器中找到并注入娃属,括號(hào)里面的name屬性值必須跟@Compenent注解里填入的名字相同惶洲。
通過(guò)注解方法便可去掉各.java文件中為屬性創(chuàng)建設(shè)置的set方法。
繼續(xù)對(duì)上述注解方式進(jìn)行配置優(yōu)化膳犹,去掉括號(hào)中的內(nèi)容:[圖片上傳失敗...(image-ab3901-1526379695716)]
[圖片上傳失敗...(image-c06366-1526379695716)]
[圖片上傳失敗...(image-ab8faa-1526379695716)]
在測(cè)試類中運(yùn)行依然可以正常運(yùn)行。
說(shuō)明:利用@Compenent注解的方式是通用的將對(duì)象加入到IOC容器中的方式签则,而有時(shí)候我們需要區(qū)別各層對(duì)象添加的方式须床,所以這里我們將Dao層對(duì)象添加到IOC容器的注解方式改為:@Repository表示持久層的組件;修改Service層對(duì)象添加到IOC容器的注解方式:@Service表示業(yè)務(wù)邏輯層的組件;修改Servlet層對(duì)象添加到IOC容器的注解方式為:@Controller表示控制層的組件。
另外需要說(shuō)明的是使用注解的方式將對(duì)象添加到IOC容器中和在xml文件中添加配置的方式是可以共存的渐裂。但通過(guò)@Resource不帶括號(hào)的注解豺旬,必須要保證該類型只有一個(gè)變量,所以一般情況下我們還是優(yōu)先使用@Resource(name="")注解柒凉。
到此族阅,Spring框架的學(xué)習(xí)我們已完成。
2018.3.19更
歡迎加入我的Java交流1群:659957958膝捞。群里目前已有1800人坦刀,每天都非常活躍,但為了篩選掉那些不懷好意的朋友進(jìn)來(lái)搞破壞鲤遥,所以目前入群方式已改成了付費(fèi)方式沐寺,你只需要支付9塊錢,即可獲取到群文件中的所有干貨以及群里面各位前輩們的疑惑解答盖奈;為了鼓勵(lì)良好風(fēng)氣的發(fā)展混坞,讓每個(gè)新人提出的問(wèn)題都得到解決,所以我將得到的入群收費(fèi)收入都以紅包的形式發(fā)放到那些主動(dòng)給新手們解決疑惑的朋友手中钢坦。在這里究孕,我們除了談技術(shù),還談生活爹凹、談理想厨诸;在這里,我們?yōu)槟愕膶W(xué)習(xí)方向指明方向逛万,為你以后的求職道路提供指路明燈泳猬;在這里,我們把所有好用的干貨都與你分享宇植。還在等什么得封,快加入我們吧!
2018.4.21更:如果群1已滿或者無(wú)法加入指郁,請(qǐng)加Java學(xué)習(xí)交流2群:305335626 忙上。群2作為群1的附屬群,除了日常的技術(shù)交流闲坎、資料分享疫粥、學(xué)習(xí)方向指明外,還會(huì)在每年互聯(lián)網(wǎng)的秋春招時(shí)節(jié)在群內(nèi)發(fā)布大量的互聯(lián)網(wǎng)內(nèi)推方式腰懂,話不多說(shuō)梗逮,快上車吧!
6.聯(lián)系
If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.