初識(shí)spring

一嚷辅、什么是spring


Spring是一個(gè)開源框架,Spring是于2003年興起的一個(gè)輕量級(jí)的Java開發(fā)框架署海,由Rod Johnson在其著作Expert One-On-One J2EE

Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的呐籽『拥框架的主要優(yōu)勢(shì)之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個(gè)組件沙庐,同時(shí)為J2EE應(yīng)用程序開發(fā)提供集成的框架鲤妥。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情佳吞。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)棉安。從簡(jiǎn)單性底扳、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益贡耽。Spring的核心是控制反轉(zhuǎn)IoC)和面向切面(AOP)衷模。簡(jiǎn)單來說,Spring是一個(gè)分層的JavaSE/EEfull-stack(一站式)輕量級(jí)開源框架菇爪。

EE開發(fā)分成三層結(jié)構(gòu):

* WEB層:Spring MVC.

*業(yè)務(wù)層:Bean管理:(IOC)

*持久層:Spring的JDBC模板.ORM模板用于整合其他的持久層框架.

Expert One-to-One J2EE Design andDevelopment:J2EE的設(shè)計(jì)和開發(fā):(2002.EJB)

Expert One-to-One J2EE Development withoutEJB:J2EE不使用EJB的開發(fā).

2.學(xué)習(xí)Spring的優(yōu)勢(shì)

方便解耦算芯,簡(jiǎn)化開發(fā)

Spring ?就是一個(gè)大工廠,可以將所有對(duì)象創(chuàng)建和依賴關(guān)系維護(hù)凳宙,交給Spring管理

AOP編程的支持

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

聲明式事物的支持

只需要通過配置就可以完成對(duì)事物的管理氏涩,而無需手動(dòng)編程届囚。

方便程序的測(cè)試

Spring對(duì)Junit4支持,可以通過注解方便的測(cè)試Spring程序

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

Spring不排斥各種優(yōu)秀的開源框架是尖,其內(nèi)部提供了各種優(yōu)秀框架(struts2意系、Hibernate)的直接支持

降低JavaEE API的使用難度

Spring對(duì)javaee開發(fā)中非常難用的一些API,都提供可封裝饺汹。是用難度降低蛔添。


IOC:Inversion of

Control控制反轉(zhuǎn).指的是對(duì)象的創(chuàng)建權(quán)反轉(zhuǎn)(交給)給Spring.

作用是實(shí)現(xiàn)了程序的解耦合.

3.使用Spring

3.1下載Spring開發(fā)包

http://spring.io/

3.2創(chuàng)建WEB項(xiàng)目,導(dǎo)包


lQ?

1.1.1.1步驟三:引入相關(guān)配置文件:

log4j.properties

applicationContext.xml

引入約束:

spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

1.1.1.2步驟四:編寫相關(guān)的類:

publicinterfaceUserDao {

publicvoidsayHello();

}

publicclassUserDaoImplimplementsUserDao {

@Override

publicvoidsayHello() {

System.out.println("Hello

Spring...");

}

}

1.1.1.3步驟五:完成配置:


"userDao"class="cn.itcast.spring.demo1.UserDaoImpl">

1.1.1.4步驟六:編寫測(cè)試程序:

@Test

// Spring的方式:

publicvoiddemo2(){

//創(chuàng)建Spring的工廠類:

ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");

//通過工廠解析XML獲取Bean的實(shí)例.

UserDaouserDao= (UserDao)applicationContext.getBean("userDao");

userDao.sayHello();

}

1.1.1.5IOC和DI:

IOC:控制反轉(zhuǎn),將對(duì)象的創(chuàng)建權(quán)交給了Spring.

DI:DependencyInjection依賴注入.需要有IOC的環(huán)境,Spring創(chuàng)建這個(gè)類的過程中,Spring將類的依賴的屬性設(shè)置進(jìn)去.

1.1.2Spring中的工廠:

1.1.2.1ApplicationContext:

ApplicatioContext接口有兩個(gè)實(shí)現(xiàn)類:

ClassPathXmlApplicationContext:加載類路徑下Spring的配置文件.

FileSystemXmlApplicationContext:加載本地磁盤下Spring的配置文件.

1.1.2.2BeanFactory:

1.1.2.3BeanFactory和ApplicationContext的區(qū)別:

BeanFactory:是在getBean的時(shí)候才會(huì)生成類的實(shí)例.

ApplicationContext:在加載applicationContext.xml時(shí)候就會(huì)創(chuàng)建.

1.1.3配置STS的XML的提示:

1.1.3.1Spring配置文件中提示的配置

復(fù)制路徑:

*http://www.springframework.org/schema/beans/spring-beans.xsd

查找XML Catalog:

點(diǎn)擊Add..

1.1.4Spring的相關(guān)配置:

1.1.4.1id屬性和name屬性標(biāo)簽的配置

id:Bean起個(gè)名字.在約束中采用ID的約束:唯一.必須以字母開始兜辞,可以使用字母迎瞧、數(shù)字、連字符逸吵、下劃線凶硅、句話、冒號(hào)id:不能出現(xiàn)特殊字符.

name:Bean起個(gè)名字.沒有采用ID的約束.name:出現(xiàn)特殊字符.如果沒有id的話, name可以當(dāng)做id使用.

*整合struts1的時(shí)候:

1.1.4.2scope屬性:Bean的作用范圍.

* singleton:默認(rèn)值扫皱,單例的.

* prototype:多例的.

* request:WEB項(xiàng)目中,Spring創(chuàng)建一個(gè)Bean的對(duì)象,將對(duì)象存入到request域中.

* session:WEB項(xiàng)目中,Spring創(chuàng)建一個(gè)Bean的對(duì)象,將對(duì)象存入到session域中.

* globalSession:WEB項(xiàng)目中,應(yīng)用在Porlet環(huán)境.如果沒有Porlet環(huán)境那么globalSession相當(dāng)于session.

1.1.4.3Bean的生命周期的配置:

通過配置標(biāo)簽上的init-method作為Bean的初始化的時(shí)候執(zhí)行的方法足绅,配置destroy-method作為Bean的銷毀的時(shí)候執(zhí)行的方法。

銷毀方法想要執(zhí)行韩脑,需要是單例創(chuàng)建的Bean而且在工廠關(guān)閉的時(shí)候氢妈,Bean才會(huì)被銷毀.

1.1.5Spring的Bean的管理XML的方式:

1.1.5.1Spring的Bean的屬性注入:

【構(gòu)造方法的方式注入屬性】


"car"class="cn.itcast.spring.demo4.Car">

undefined"name"value="保時(shí)捷"/>undefined

undefined"price"value="1000000"/>undefined

【set方法的方式注入屬性】


"car2"class="cn.itcast.spring.demo4.Car2">

"name"value="奇瑞QQ"/>

"price"value="40000"/>

1.1.5.2Spring的屬性注入:對(duì)象類型的注入:


"person"class="cn.itcast.spring.demo4.Person">

"name"value="會(huì)希"/>


"car2"ref="car2"/>

1.1.5.3名稱空間p的屬性注入的方式:Spring2.x版本后提供的方式.

第一步:引入p名稱空間

xmlns:p="http://www.springframework.org/schema/p"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

第二步:使用p名稱空間.

*普通屬性:p:屬性名稱=””

*對(duì)象類型屬性:p:屬性名稱-ref=””


p:price="1200000"/>

1.1.5.4SpEL的方式的屬性注入:Spring3.x版本后提供的方式.

SpEL:Spring Expression Language.

語法:#{ SpEL }


"car2"class="cn.itcast.spring.demo4.Car2">

"name"value="#{'奔馳'}"/>

"price"value="#{800000}"/>

引用了另一個(gè)類的屬性


1.1.5.5注入復(fù)雜類型:


"collectionBean"class="cn.itcast.spring.demo5.CollectionBean">


"arrs">

會(huì)希

冠希

天一


"list">

芙蓉

如花

鳳姐


"map">

"aaa"value="111"/>

"bbb"value="222"/>

"ccc"value="333"/>


"properties">

"username">root

"password">123

1.1.5.6Spring的分配置文件的開發(fā)

一種:創(chuàng)建工廠的時(shí)候加載多個(gè)配置文件:

ApplicationContext applicationContext = newClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");

二種:在一個(gè)配置文件中包含另一個(gè)配置文件:

1.2案例代碼

1.2.1搭建環(huán)境:

1.2.1.1創(chuàng)建web項(xiàng)目,引入jar包.

WEB層使用Struts2:

* Struts2開發(fā)的基本的包

Spring進(jìn)行Bean管理:

*Spring開發(fā)的基本的包

1.2.1.2引入配置文件:

Struts2:

*web.xml

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

/*

*struts.xml

Spring:

*applicationContext.xml

*log4j.properties

1.2.1.3引入頁面:

1.2.1.4創(chuàng)建包結(jié)構(gòu)和類:

1.2.1.5在添加頁面提交內(nèi)容到Action:

1.2.1.6改寫Action類并配置Action:

"crm"extends="struts-default"namespace="/">

"customer_*"class="cn.itcast.crm.web.action.CustomerAction"method="{1}">

1.2.1.7在Action調(diào)用業(yè)務(wù)層:

將業(yè)務(wù)層類配置到Spring中:

在Action中獲取業(yè)務(wù)層類:

publicString save(){

System.out.println("Action中的save方法執(zhí)行了...");

System.out.println(customer);

//傳統(tǒng)方式:

/*CustomerService customerService = new CustomerServiceImpl();

customerService.save(customer);*/

// Spring的方式進(jìn)行操作:

ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");

CustomerServicecustomerService= (CustomerService)applicationContext.getBean("customerService");

customerService.save(customer);

returnNONE;

}

****每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)工廠類,服務(wù)器端的資源就浪費(fèi)了,一般情況下一個(gè)工程只有一個(gè)Spring的工廠類就OK了.

*將工廠在服務(wù)器啟動(dòng)的時(shí)候創(chuàng)建好,將這個(gè)工廠放入到ServletContext域中.每次獲取工廠從ServletContext域中進(jìn)行獲取.

*ServletContextLinstener:監(jiān)聽ServletContext對(duì)象的創(chuàng)建和銷毀.

1.2.2Spring整合WEB項(xiàng)目

1.2.2.1引入spring-web.jar包:

配置監(jiān)聽器:

org.springframework.web.context.ContextLoaderListener

contextConfigLocation

classpath:applicationContext.xml

1.2.2.2改寫Action:

/**

*保存客戶的執(zhí)行的方法:save

*/

publicString save(){

//傳統(tǒng)方式:

/*CustomerService

customerService = new CustomerServiceImpl();

customerService.save(customer);*/

// Spring的方式進(jìn)行操作:

/*ApplicationContext

applicationContext = new

ClassPathXmlApplicationContext("applicationContext.xml");

CustomerService customerService = (CustomerService)

applicationContext.getBean("customerService");*/

WebApplicationContextapplicationContext=WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());

CustomerServicecustomerService= (CustomerService)applicationContext.getBean("customerService");

System.out.println("Action中的save方法執(zhí)行了...");

System.out.println(customer);

customerService.save(customer);

returnNONE;

}

1.2.2.3編寫Dao并配置:

1.2.2.4業(yè)務(wù)層調(diào)用DAO:

publicclassCustomerServiceImplimplementsCustomerService {

privateCustomerDaocustomerDao;

publicvoidsetCustomerDao(CustomerDaocustomerDao) {

this.customerDao=customerDao;

}

}

??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扰才,一起剝皮案震驚了整個(gè)濱河市允懂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衩匣,老刑警劉巖蕾总,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粥航,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡生百,警方通過查閱死者的電腦和手機(jī)递雀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚀浆,“玉大人缀程,你說我怎么就攤上這事∈锌。” “怎么了杨凑?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)摆昧。 經(jīng)常有香客問我撩满,道長(zhǎng),這世上最難降的妖魔是什么绅你? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任伺帘,我火速辦了婚禮,結(jié)果婚禮上忌锯,老公的妹妹穿的比我還像新娘伪嫁。我一直安慰自己,他們只是感情好偶垮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布张咳。 她就那樣靜靜地躺著,像睡著了一般似舵。 火紅的嫁衣襯著肌膚如雪晶伦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天啄枕,我揣著相機(jī)與錄音,去河邊找鬼族沃。 笑死频祝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脆淹。 我是一名探鬼主播常空,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盖溺!你這毒婦竟也來了漓糙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤烘嘱,失蹤者是張志新(化名)和其女友劉穎昆禽,沒想到半個(gè)月后蝗蛙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醉鳖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年捡硅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盗棵。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壮韭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纹因,到底是詐尸還是另有隱情喷屋,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布瞭恰,位于F島的核電站屯曹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寄疏。R本人自食惡果不足惜是牢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陕截。 院中可真熱鬧驳棱,春花似錦、人聲如沸农曲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乳规。三九已至形葬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暮的,已是汗流浹背笙以。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冻辩,地道東北人猖腕。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恨闪,于是被迫代替她去往敵國(guó)和親倘感。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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