spring in action

# 開(kāi)始spring之旅

## 歷史

javabean -> EJB -> spring

## why

spring 簡(jiǎn)化了企業(yè)級(jí)系統(tǒng)開(kāi)發(fā). 原因是EJB太復(fù)雜了

1.好的設(shè)計(jì)比實(shí)現(xiàn)技術(shù)更重要

2.通過(guò)接口耦合的javabean是一個(gè)很好的模型

3.代碼應(yīng)該容易被測(cè)試

spring是一個(gè)輕量級(jí)的IOC和AOP框架亮蛔。

## spring模塊

1.core

2.AOP

3.O/R 映射

4.web context

5.applicaiton context

6.jdbc & dao

7.mvc

## spring hello world

首選寫(xiě)接口類(lèi)

public interface GreetingService {

public void sayHello();

}

第二步實(shí)現(xiàn)類(lèi)

public class GreetingServiceImpl implements GreetingService {

private String greeting;

public String getGreeting() {

return greeting;

}

public void setGreeting(String greeting) {

this.greeting = greeting;

}

public void sayHello() {

System.out.println(this.greeting);

}

}

第三步 配置bean.xml

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

xsi:schemaLocation="

http://www.springframework.org/schema/beans

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

hello world

第四步 使用

public class main {

public static??void main(String [] args) {

ClassPathResource resource = new ClassPathResource("beans/beans.xml");

System.out.println(resource.getPath());

BeanFactory factory = new GenericXmlApplicationContext(resource);

GreetingService greeting = (GreetingService) factory.getBean("greetService");

greeting.sayHello();

}

}

但是這樣使用和

GreetingService greeting = new GreetingServiceImpl()

相比為一個(gè)的區(qū)別就是把GreetingService的實(shí)例化用配置來(lái)代替了. 這就是傳說(shuō)中的IOC

##理解IOC

IOC ,即反轉(zhuǎn)控制眷细。 是spring的核心爷辱。

當(dāng)然用 依賴(lài)注入來(lái)解釋會(huì)更容易理解。 當(dāng)A使用了B, 在A實(shí)例化的時(shí)候路狮,也必須實(shí)例化B,表明類(lèi)A對(duì)B有了依賴(lài)愤钾。 我們把B的實(shí)例化抽取出來(lái)蛙讥,而是采用在外部系統(tǒng)控制B的實(shí)例化并負(fù)責(zé)注入到A中,這樣就實(shí)現(xiàn)了A和B的耦合遇西。這就是所謂的依賴(lài)注入馅精。

## IOC例子

騎士找圣杯

public class KnightOfRoundTable {

private String name;

private HolyGrailQuest quest;

public KnightOfRoundTable(String name) {

this.name = name;

this.quest = new HolyGrailQuest();

}

public??HolyGrail embarkOnQuest(){

return quest.embark();

}

}

當(dāng)我們寫(xiě)單元測(cè)試的時(shí)候會(huì)發(fā)現(xiàn)當(dāng)寫(xiě)了KnightOfRoundTable的時(shí)候順帶把HolyGrailQuest 也寫(xiě)進(jìn)去了。 因?yàn)镵nightOfRoundTable 和 HolyGrailQuest 耦合在一起了粱檀。

耦合的代碼

-難以測(cè)試洲敢, 難以使用,帶來(lái)典型的"摧毀大堤"的bug

-但是沒(méi)有耦合的代碼什么也做不了

所以我們要管理耦合

其最常見(jiàn)的一個(gè)方法就是面向接口編程

public interface IQuest {

public??HolyGrail embark();

}

同樣:

public interface IKnight {

HolyGrail embarkOnQuest();

}

在 KnightOfRoundTable 中茄蚯,就需要把任務(wù)裝配進(jìn)去

public void setQuest(IQuest quest) {

this.quest = quest;

}

然后配置bean:

undefinedundefined

John

創(chuàng)建系統(tǒng)組件之間關(guān)聯(lián)的動(dòng)作叫做裝配压彭。spring中有很多裝配的方式,其中XML是最常見(jiàn)的一種渗常。

以上是以來(lái)控制的全部: 協(xié)調(diào)依賴(lài)對(duì)象之間合作的責(zé)任壮不,從對(duì)象之間釋放出來(lái)。

## 應(yīng)用AOP

理想的系統(tǒng)是有很多組件組成凳谦,每一個(gè)組件負(fù)責(zé)其中一部分的功能忆畅。但是實(shí)際情況是像日志管理這樣的組件,進(jìn)程侵入到其他系統(tǒng)中。

回答上面的例子家凯, 我們假設(shè)需求變更了缓醋, 每一次騎士做任務(wù)之前,都需要配置一個(gè)吟游詩(shī)人來(lái)歌頌他的事跡

public??HolyGrail embarkOnQuest(){

this.mistrel.compose(this.name, "embark");

return quest.embark();

}

那么問(wèn)題來(lái)了绊诲, 其實(shí)必須每一次都主動(dòng)觸發(fā) mistrel 去干什么送粱。但是騎士騎士不用關(guān)心 mistrel 干了什么事情的。簡(jiǎn)單的說(shuō) mistrel 提供的服務(wù)超出了騎士本來(lái)的責(zé)任掂之,也就是說(shuō)mistrel和騎士的服務(wù)交叉在一起了抗俄。所以把mistrel實(shí)現(xiàn)成切面,并把他的服務(wù)提供給騎士是合理的世舰。

public class Minstrel implements MethodBeforeAdvice {

public void before(Method method, Object[] args, Object target) throws Throwable {

IKnight knight = (IKnight)target;

String name = knight.getName();

System.out.println(name + ":" + knight.embarkOnQuest().toString());

}

}

配置bean

chaper01.knight.IKnight

minstrel

最典型的應(yīng)用就是數(shù)據(jù)庫(kù)的事物动雹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跟压,隨后出現(xiàn)的幾起案子胰蝠,更是在濱河造成了極大的恐慌,老刑警劉巖震蒋,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茸塞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡查剖,警方通過(guò)查閱死者的電腦和手機(jī)钾虐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)笋庄,“玉大人效扫,你說(shuō)我怎么就攤上這事≈鄙埃” “怎么了荡短?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哆键。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瘦锹,這世上最難降的妖魔是什么籍嘹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮弯院,結(jié)果婚禮上辱士,老公的妹妹穿的比我還像新娘。我一直安慰自己听绳,他們只是感情好颂碘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著椅挣,像睡著了一般头岔。 火紅的嫁衣襯著肌膚如雪塔拳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天峡竣,我揣著相機(jī)與錄音靠抑,去河邊找鬼。 笑死适掰,一個(gè)胖子當(dāng)著我的面吹牛颂碧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播类浪,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼载城,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了费就?” 一聲冷哼從身側(cè)響起诉瓦,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎受楼,沒(méi)想到半個(gè)月后垦搬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艳汽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年猴贰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片河狐。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡米绕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馋艺,到底是詐尸還是另有隱情栅干,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布捐祠,位于F島的核電站碱鳞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏踱蛀。R本人自食惡果不足惜窿给,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望率拒。 院中可真熱鬧崩泡,春花似錦、人聲如沸角撞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)热康。三九已至百炬,卻和暖如春褐隆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剖踊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留德澈,地道東北人歇攻。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓梆造,卻偏偏與公主長(zhǎng)得像缴守,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镇辉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 縱覽Spring 屡穗, 讀者會(huì)發(fā)現(xiàn)Spring 可以做非常多的事情忽肛。 但歸根結(jié)底村砂, 支撐Spring的僅僅是少許的基...
    六尺帳篷閱讀 1,638評(píng)論 0 12
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理屹逛,服務(wù)發(fā)現(xiàn),斷路器罕模,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • spring 關(guān)鍵策略 1 基于pojo的輕量級(jí)和最小侵入性編程 2 通過(guò)依賴(lài)注入和面向接口實(shí)現(xiàn)松耦合 3 基于切...
    wi11iam閱讀 393評(píng)論 0 0
  • 對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō)淑掌,現(xiàn)在是一個(gè)很好的時(shí)期蒿讥。 在20年的歷史中抛腕,Java經(jīng)歷過(guò)一些好的時(shí)期以及不好的時(shí)期诈悍。盡管存...
    龍?jiān)诎⒗?/span>閱讀 331評(píng)論 0 1
  • 第一章 簡(jiǎn)化Java開(kāi)發(fā) 基于POJO的輕量級(jí)和最小侵入性編程 通過(guò)依賴(lài)注入和面向接口實(shí)現(xiàn)松耦合 基于切面和慣例進(jìn)...
    言西棗閱讀 152評(píng)論 0 0