開發(fā)框架Spring核心技術(shù)含Resource接口詳細(xì)講解 全球熱點(diǎn)評(píng)
2023-06-26 14:01:19 來(lái)源:今日頭條
Spring 是 Java EE 編程領(lǐng)域的一款輕量級(jí)的開源框架,由被稱為“Spring 之父”的 Rod Johnson 于 2002 年提出并創(chuàng)立,它的目標(biāo)就是要簡(jiǎn)化 Java 企業(yè)級(jí)應(yīng)用程序的開發(fā)難度和周期。
Spring 自誕生以來(lái)備受青睞,一直被廣大開發(fā)人員作為 Java 企業(yè)級(jí)應(yīng)用程序開發(fā)的首選。時(shí)至今日,Spring 儼然成為了 Java EE 代名詞,成為了構(gòu)建 Java EE 應(yīng)用的事實(shí)標(biāo)準(zhǔn)。
(資料圖)
1. Spring簡(jiǎn)介Spring是一個(gè)分層的Java SE/EE應(yīng)用一站式的輕量級(jí)開源框架。Spring核心是IOC和AOP。
Spring主要優(yōu)點(diǎn)包括:
方便解耦,簡(jiǎn)化開發(fā),通過(guò)Spring提供的IoC容器,我們可以將對(duì)象之間的依賴關(guān)系交由Spring進(jìn)行控制,避免硬編碼造成的程序耦合度高。AOP編程的支持,通過(guò)Spring提供的AOP功能,方便進(jìn)行面向切面編程。聲明式事務(wù)的支持,在Spring中,我們可以從單調(diào)煩悶的事務(wù)管理代碼中解脫出來(lái),通過(guò)聲明式方式靈活地進(jìn)行事務(wù)的管理,提高開發(fā)效率和質(zhì)量。方便程序的測(cè)試,可以用非容器依賴的編程方式進(jìn)行幾乎所有的測(cè)試工作。方便集成各種優(yōu)秀框架,Spring提供了對(duì)各種優(yōu)秀框架的直接支持。2. Spring體系結(jié)構(gòu)如下圖所示,整個(gè)spring框架按其所屬功能可以劃分為五個(gè)主要模塊,這五個(gè)模塊幾乎為企業(yè)應(yīng)用提供了所需的一切,從持久層、業(yè)務(wù)層到表現(xiàn)層都擁有相應(yīng)的支持,這就是為什么稱Spring是一站式框架的原因。
2.1 核心模塊(Core Container)Spring的核心模塊實(shí)現(xiàn)了IoC的功能,它將類和類之間的依賴從代碼中脫離出來(lái),用配置的方式進(jìn)行依賴關(guān)系描述。由IoC容器負(fù)責(zé)類的創(chuàng)建,管理,獲取等。BeanFactory接口是Spring框架的核心接口,實(shí)現(xiàn)了容器很多核心的功能。
Context模塊構(gòu)建于核心模塊之上,擴(kuò)展了BeanFactory的功能,包括國(guó)際化,資源加載,郵件服務(wù),任務(wù)調(diào)度等多項(xiàng)功能。ApplicationContext是Context模塊的核心接口。
表達(dá)式語(yǔ)言(Expression Language)是統(tǒng)一表達(dá)式語(yǔ)言(EL)的一個(gè)擴(kuò)展,支持設(shè)置和獲取對(duì)象屬性,調(diào)用對(duì)象方法,操作數(shù)組、集合等。使用它可以很方便的通過(guò)表達(dá)式和Spring IoC容器進(jìn)行交互。
2.2 AOP模塊Spring AOP模塊提供了滿足AOP Alliance規(guī)范的實(shí)現(xiàn),還整合了AspectJ這種AOP語(yǔ)言級(jí)的框架。通過(guò)AOP能降低耦合。
2.3 數(shù)據(jù)訪問集成模塊(Data Access/Integration )該模塊包括了JDBC、ORM、OXM、JMS和事務(wù)管理:
事務(wù)模塊:該模塊用于Spring管理事務(wù),只要是Spring管理對(duì)象都能得到Spring管理事務(wù)的好處,無(wú)需在代碼中進(jìn)行事務(wù)控制了,而且支持編程和聲明性的事務(wù)管理。JDBC模塊:提供了一個(gè)JBDC的樣例模板,使用這些模板能消除傳統(tǒng)冗長(zhǎng)的JDBC編碼還有必須的事務(wù)控制,而且能享受到Spring管理事務(wù)的好處。ORM模塊:提供與流行的“對(duì)象-關(guān)系”映射框架的無(wú)縫集成,包括hibernate、JPA、MyBatis等。而且可以使用Spring事務(wù)管理,無(wú)需額外控制事務(wù)。OXM模塊:提供了一個(gè)對(duì)Object/XML映射實(shí)現(xiàn),將Java對(duì)象映射成XML數(shù)據(jù),或者將XML數(shù)據(jù)映射成java對(duì)象,Object/XML映射實(shí)現(xiàn)包括JAXB、Castor、XMLBeans和XStream。JMS模塊:用于JMS(Java Messaging Service),提供一套“消息生產(chǎn)者、消息消費(fèi)者”模板用于更加簡(jiǎn)單的使用JMS,JMS用于在兩個(gè)應(yīng)用程序之間,或分布式系統(tǒng)中發(fā)送消息,進(jìn)行異步通信。2.4 Web模塊該模塊建立在ApplicationContext模塊之上,提供了Web應(yīng)用的功能,如文件上傳、FreeMarker等。Spring可以整合Struts2等MVC框架。此外,Spring自己提供了MVC框架Spring MVC。
2.5 測(cè)試模塊Spring可以用非容器依賴的編程方式進(jìn)行幾乎所有的測(cè)試工作,支持JUnit和TestNG等測(cè)試框架。
3. 初識(shí)Ioc與DI我們首先來(lái)講解一下IoC的概念。IoC(控制反轉(zhuǎn):Inverse of Control)是Spring容器的核心,但是IoC這個(gè)概念卻比較晦澀,讓人不太容易望文生義。
3.1 IoC控制反轉(zhuǎn)和DI依賴注入傳統(tǒng)程序設(shè)計(jì)中,我們需要使用某個(gè)對(duì)象的方法,需要先通過(guò)new創(chuàng)建一個(gè)該對(duì)象,我們這時(shí)是主動(dòng)行為;而IoC是我們將創(chuàng)建對(duì)象的控制權(quán)交給IoC容器,這時(shí)是由容器幫忙創(chuàng)建及注入依賴對(duì)象,我們的程序被動(dòng)的接受IoC容器創(chuàng)建的對(duì)象,控制權(quán)反轉(zhuǎn),所以叫控制反轉(zhuǎn)。
由于IoC確實(shí)不夠開門見山,所以提出了DI(依賴注入:Dependency Injection)的概念,即讓第三方來(lái)實(shí)現(xiàn)注入,以移除我們類與需要使用的類之間的依賴關(guān)系??偟膩?lái)說(shuō),IoC是目的,DI是手段,創(chuàng)建對(duì)象的過(guò)程往往意味著依賴的注入。我們?yōu)榱藢?shí)現(xiàn)IoC,讓生成對(duì)象的方式由傳統(tǒng)方式(new)反轉(zhuǎn)過(guò)來(lái),需要?jiǎng)?chuàng)建相關(guān)對(duì)象時(shí)由IoC容器幫我們注入(DI)。
簡(jiǎn)單的說(shuō),就是我們類里需要另一個(gè)類,只需要讓Spring幫我們創(chuàng)建 ,這叫做控制反轉(zhuǎn);然后Spring幫我們將需要的對(duì)象設(shè)置到我們的類中,這叫做依賴注入。
3.2 常見的幾種注入方法使用有參構(gòu)造方法注入
public class User{ private String name; public User(String name){ this.name=name; }} User user=new User("tom");
使用屬性注入
public class User{ private String name; public void setName(String name){ this.name=name; }} User user=new User(); user.setName("jack");
使用接口注入
// 將調(diào)用類所有依賴注入的方法抽取到接口中,調(diào)用類通過(guò)實(shí)現(xiàn)該接口提供相應(yīng)的注入方法。 public interface Dao{ public void delete(String name);} public class DapIml implements Dao{ private String name; public void delete(String name){ this.name=name; }}
通過(guò)容器完成依賴關(guān)系的注入
上面的注入方式都需要我們手動(dòng)的進(jìn)行注入,如果有一個(gè)第三方容器能幫助我們完成類的實(shí)例化,以及依賴關(guān)系的裝配,那么我們只需要專注于業(yè)務(wù)邏輯的開發(fā)即可。Spring就是這樣的容器,它通過(guò)配置文件或注解描述類和類之間的依賴關(guān)系,自動(dòng)完成類的初始化和依賴注入的工作。
3.3 Spring的IoC例子(1) 創(chuàng)建工程,導(dǎo)入jar包
這里我們只是做IoC的操作,所以只需要導(dǎo)入核心模塊里的jar包,beans、core、context、expression等。因?yàn)閟pring中并沒有日志相關(guān)的jar包,所以我們還需要導(dǎo)入log4j和commons-logging。
(2) 創(chuàng)建一個(gè)類
public class User { public void add(){ System.out.println("add....."); }}
(3) 創(chuàng)建一個(gè)xml配置文件
//配置要?jiǎng)?chuàng)建的類
(4) 進(jìn)行測(cè)試
//這只是用來(lái)測(cè)試的代碼,后期不會(huì)這么寫public class Test { @org.junit.Test public void test(){ //加載配置文件 ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml"); //獲取對(duì)象 User user=(User) context.getBean("user"); System.out.println(user); //調(diào)用方法 user.add(); }}
在容器啟動(dòng)時(shí),Spring會(huì)根據(jù)配置文件的描述信息,自動(dòng)實(shí)例化Bean并完成依賴關(guān)系的裝配,從容器中即可獲得Bean實(shí)例,就可以直接使用。Spring為什么僅憑一個(gè)簡(jiǎn)單的配置文件,就能神奇的實(shí)例化并配置好程序使用的Bean呢?答案是通過(guò) Java的反射技術(shù)。
3.4 Spring的DI例子我們的service層總是用到dao層,以前我們總是在Service層new出dao對(duì)象,現(xiàn)在我們使用依賴注入的方式向Service層注入dao層。
// UserDaopublic class UserDao { public void add(){ System.out.println("dao....."); }}// UserServicepublic class UserService { UserDao userdao; public void setUserdao(UserDao userdao){ this.userdao=userdao; } public void add(){ System.out.println("service......."); userdao.add(); }}----------------------------------------------------// 配置文件 //這樣在實(shí)例化service的時(shí)候,同時(shí)裝配了dao對(duì)象,實(shí)現(xiàn)了依賴注入 //ref為dao的id值
4. Spring資源訪問神器——Resource接口JDK提供的訪問資源的類(如java.NET.URL,File)等并不能很好很方便的滿足各種底層資源的訪問需求。Spring設(shè)計(jì)了一個(gè)Resource接口,為應(yīng)用提供了更強(qiáng)的訪問底層資源的能力,該接口擁有對(duì)應(yīng)不同資源類型的實(shí)現(xiàn)類。
4.1 Resource接口的主要方法boolean exists():資源是否存在boolean isOpen():資源是否打開URL getURL():返回對(duì)應(yīng)資源的URLFile getFile():返回對(duì)應(yīng)的文件對(duì)象InputStream getInputStream():返回對(duì)應(yīng)資源的輸入流Resource在Spring框架中起著不可或缺的作用,Spring框架使用Resource裝載各種資源,包括配置文件資源,國(guó)際化屬性資源等。
4.2 Resource接口的具體實(shí)現(xiàn)類ByteArrayResource:二進(jìn)制數(shù)組表示的資源ClassPathResource:類路徑下的資源 ,資源以相對(duì)于類路徑的方式表示FileSystemResource:文件系統(tǒng)資源,資源以文件系統(tǒng)路徑方式表示,如d:/a/b.txtInputStreamResource:對(duì)應(yīng)一個(gè)InputStream的資源ServletContextResource:為訪問容器上下文中的資源而設(shè)計(jì)的類。負(fù)責(zé)以相對(duì)于web應(yīng)用根目錄的路徑加載資源UrlResource:封裝了java.net.URL。用戶能夠訪問任何可以通過(guò)URL表示的資源,如Http資源,F(xiàn)tp資源等4.3 Spring的資源加載機(jī)制為了訪問不同類型的資源,必須使用相應(yīng)的Resource實(shí)現(xiàn)類,這是比較麻煩的。Spring提供了一個(gè)強(qiáng)大的加載資源的機(jī)制,僅通過(guò)資源地址的特殊標(biāo)識(shí)就可以加載相應(yīng)的資源。
Spring定義了一套資源加載的接口。ResourceLoader接口僅有一個(gè)getResource(String location)的方法,可以根據(jù)資源地址加載文件資源。資源地址僅支持帶資源類型前綴的地址,不支持Ant風(fēng)格的資源路徑表達(dá)式。ResourcePatternResolver擴(kuò)展ResourceLoader接口,定義新的接口方法getResources(String locationPattern),該方法支持帶資源類型前綴以及Ant風(fēng)格的資源路徑的表達(dá)式。PathMatchingResourcePatternResolver是Spring提供的標(biāo)準(zhǔn)實(shí)現(xiàn)類。
關(guān)鍵詞:
相關(guān)閱讀
- (2023-06-26)開發(fā)框架Spring核心技術(shù)含Resource接口詳細(xì)講解 全球熱點(diǎn)評(píng)
- (2023-06-26)全球速看:尼山論“見”丨汪壽陽(yáng):借助數(shù)字化將孔府家宴推向全國(guó)乃至世界
- (2023-06-26)2023年6月廣州中小客車增量指標(biāo)搖號(hào)成功配置指標(biāo)8143個(gè) 全球速訊
- (2023-06-26)電視劇網(wǎng)播熱度榜,《偷偷藏不住》跌至第三,你在追哪一部?
- (2023-06-26)三祥新材:寧德文達(dá)鎂鋁一體化鑄造業(yè)務(wù)已在新能源電池等領(lǐng)域?qū)崿F(xiàn)量產(chǎn) 環(huán)球觀察
- (2023-06-26)佛山南海多鎮(zhèn)街已出現(xiàn)!警方提醒→
- (2023-06-26)高質(zhì)量發(fā)展蹲點(diǎn)調(diào)研采訪|從“打工仔”到“牛司令”!致富帶頭人吳配月的華麗“變身”
- (2023-06-26)今熱點(diǎn):哇哦,迪卡儂造車了?。?!
- (2023-06-26)最終幻想16小心饑餓的陸行鳥任務(wù)指南
- (2023-06-26)【全球新要聞】毒品犯罪高發(fā)勢(shì)頭得到有效遏制 全國(guó)鐵路公安機(jī)關(guān)查緝、宣傳“兩手抓”
- (2023-06-26)北方,怎么比南方還熱?_全球最資訊
- (2023-06-26)2023年合肥靈活就業(yè)人員社保繳費(fèi)檔次表最新公布
- (2023-06-26)天奇股份(002009.SZ):子公司無(wú)錫天捷曾總承包建造了深圳優(yōu)必選人形機(jī)器人裝配線項(xiàng)目_焦點(diǎn)熱文
- (2023-06-26)倒計(jì)時(shí)1天,山東社科論壇大咖專家齊聚臨沂共話傳承弘揚(yáng)沂蒙精神
- (2023-06-26)6人團(tuán)伙休漁期捕撈鰻魚苗被抓 1400余尾鰻魚苗放生 天天報(bào)道
- (2023-06-26)當(dāng)前快播:人工智能概念再度下挫 海天瑞聲、寒武紀(jì)等跌超10%
- (2023-06-26)清風(fēng)頭條|湖南桑植:“1314”工作法助推“三湘護(hù)農(nóng)”見實(shí)效
- (2023-06-26)2023上海各區(qū)小學(xué)暑假轉(zhuǎn)學(xué)時(shí)間表(開始+結(jié)束)_熱議
- (2023-06-26)世界快消息!突發(fā) | 諾貝爾獎(jiǎng)得主、現(xiàn)代投資組合理論先驅(qū)哈里·馬科維茨去世,享年95歲
- (2023-06-26)今日關(guān)注:人民網(wǎng)評(píng):嚴(yán)守耕地紅線,端牢中國(guó)飯碗
- (2023-06-26)長(zhǎng)白山天池的水只出不進(jìn),為何沒有干涸?這么大一水池真沒魚?-世界時(shí)快訊
- (2023-06-26)陜西高考錄取分?jǐn)?shù)線公布 本科一批文史類489分 理工類443分
- (2023-06-26)印度小伙:沒想到中國(guó)發(fā)展這么好|世界報(bào)道
- (2023-06-26)全球處關(guān)鍵時(shí)刻 摩根大通:美國(guó)應(yīng)準(zhǔn)備迎接衰退 現(xiàn)貨黃金仍被看空?
- (2023-06-26)開源許可證亟需更新——擺脫 1980 年代束縛、應(yīng)對(duì)人工智能 世界簡(jiǎn)訊
- (2023-06-26)26家餐飲店當(dāng)街打擂,襄陽(yáng)襄城區(qū)第二屆閘口大蝦節(jié)開啟“蝦”季模式
- (2023-06-26)深圳樂佳醫(yī)療美容門診部使用未依法注冊(cè)的醫(yī)療器械案 視焦點(diǎn)訊
- (2023-06-26)環(huán)球今日訊!2年被家暴16次 當(dāng)事女子發(fā)聲:懷孕2個(gè)月便開始拳打腳踢?。?/a>
- (2023-06-26)天天快消息!荊州法院依法嚴(yán)懲毒品犯罪 三年審結(jié)663案重刑率達(dá)38.44%
- (2023-06-26)環(huán)球信息:侯馬市公安局民警幫旅客找到遺失手機(jī)