Spring之旅

Spring是一個開源框架鼠渺,Spring根本使命:簡化Java開發(fā)。

為了簡化java開發(fā)的復雜性恨旱,Spring使用如下4種策略:

1座慰、基于POJO(Plain Old Java Object? 簡單Java對象 )的輕量級和最小侵入性編程。

2械荷、通過依賴注入和面向接口實現(xiàn)松耦合共耍。

3、基于切面和慣例進行聲明式編程吨瞎。

4痹兜、通過切面和模板減少樣板式代碼。

這里以一個騎士出征的例子來解釋一些相關(guān)概念

首先定義一個騎士接口颤诀,其中有一個embarkOnQuest方法字旭。

package hoo.knights;

public interface Knight {

? ? void embarkOnQuest();

}

然后再定義一個遠征行動接口。

package hoo.knights;

public interface Quest {

void embark();

}

下一步定義一個拯救少女行動類

package hoo.knights;

public class RescueDamselQuest implements Quest{

@Override

? ? public void embark() {

?????System.out.println("Embarking on a quest to rescue the damsel");

}

}

再定義一個屠殺巨龍行動類

package hoo.knights;

import java.io.PrintStream;


public class SlayDragonQuest implements Quest{

private PrintStreamprintStream;


? ? public SlayDragonQuest(PrintStream printStream){

this.printStream = printStream;

}

@Override

? ? public void embark() {

printStream.println("Embarking on quest to slay the dragon");

}

}


接下來定義一個英勇的騎士類實現(xiàn)騎士接口

package hoo.knights;

public class BraveKnight implements Knight{

private Questquest;


? ? public BraveKnight(Quest quest){

this.quest = quest;

}

@Override

? ? public void embarkOnQuest() {

quest.embark();

}

}

到這里可能就有人將BraveKnight類寫成:

package hoo.knights;

public class BraveKnight implements Knight{

private Questquest;

? ? public BraveKnight(){

quest = new?RescueDamselQuest ();

}

@Override

? ? public void embarkOnQuest() {

quest.embark();

}

}

但是有一種情況:騎士不僅僅可以去殺龍還可以去拯救少女這里將它寫死就不太合適崖叫,采用傳遞一個Quest對象遗淳,只要實現(xiàn)了Quest類的接口,任何類都可以傳進來心傀,騎士就可以去做很多行動屈暗,不是只執(zhí)行一個任務。

這是依賴注入(DI)的一種方式:構(gòu)造器注入

同樣SlayDragonQuest類中也有依賴注入:將一個PrintStream對象注入到SlayDragonQuest中。

騎士出征之前和之后需要法師的吟唱养叛,騎士類擁有法師類對象似乎不是一個好的選擇种呐,法師不應該被騎士擁有,有的騎士也不想法師吟唱這里先定義一個法師類一铅。

package hoo.knights;

import java.io.PrintStream;

public class Minstrel {

private PrintStream printStream;

public Minstrel(PrintStream printStream){

this.printStream = printStream;

}

public void singBeforeQuest(){

printStream.println("Fa la la,the knight is so brave!");

}

public void singAfterQuest(){

printStream.println("Tee hee hee , the brave knight did embark on a quest");

}

}

法師的吟唱是騎士的出征非關(guān)鍵因素陕贮,這里利用AOP來實現(xiàn)法師吟唱模塊化。

有多個Quest對象可以被注入到BraveKnight中潘飘,到底選擇哪一個來注入呢肮之??

這里利用XML來正確裝配這些對象卜录。

裝配的方式有:自動裝配戈擒、XML顯式裝配、Java顯式裝配艰毒。

先定義knight.xml來解決騎士到底要做什么的問題筐高。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

? ? ? 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.xsd">

<bean id="knight" class="hoo.knights.BraveKnight">

<constructor-arg ref="quest"/>

</bean>

<bean id="quest" class="hoo.knights.SlayDragonQuest">

<constructor-arg value="#{T(System).out}"/>

</bean>

</beans>

使用<bean></bean>聲明一個bean 其中id為自己指定的名字 class為bean的類

<constructor-arg> 元素為構(gòu)造器參數(shù) ref為依賴的bean,第一個constructor元素就決定了將一個id為quest的bean注入到id為knight的對象中丑瞧。第二個constructor元素中 value代表將一個System.out值傳入構(gòu)造器柑土。

第一個constructor元素就決定了騎士去殺龍而不是拯救少女。

等等绊汹,法師吟唱在哪稽屏??西乖?

<?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:aop="http://www.springframework.org/schema/aop"

? ? ? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<bean id="knight" class="hoo.knights.BraveKnight">

<constructor-arg ref="quest"/>

</bean>

<bean id="quest" class="hoo.knights.SlayDragonQuest">

<constructor-arg value="#{T(System).out}"/>

</bean>

<bean id="minstrel" class="hoo.knights.Minstrel">

<constructor-arg value="#{T(System).out}"/>

</bean>

<aop:config>

<aop:aspect ref="minstrel">

<aop:pointcut id="embark" expression="execution(* *.embarkOnQuest(..))"/>

<aop:before pointcut-ref="embark" method="singBeforeQuest"/>

<aop:after pointcut-ref="embark" method="singAfterQuest"/>

</aop:aspect>

</aop:config>

</beans>

<aop:aspect ref="minstrel">這一句將法師類聲明為一個切面(AOP)狐榔。

pointcut定義了一個切入點,before決定在切入點之前做什么获雕,after決定在切入點之后做什么薄腻。

來到驗證階段,看看騎士到底干了啥事届案?

package hoo.knights;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class KnightMain {

public static void main(String[] args)throws Exception{

ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("minstrel.xml");

//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");

? ? ? ? Knight knight = context.getBean(Knight.class);

knight.embarkOnQuest();

context.close();

}

}

ClassPathXmlApplicationContext 從xml文件中讀取bean裝配信息庵楷,這玩意叫應用上下文。楣颠。

第一個決定了法師要出來吟唱嫁乘,通過控制臺可以看到法師出來吟唱了,并且騎士執(zhí)行的是殺龍的行動球碉。

法師吟唱

注釋的第二行決定法師不出來吟唱蜓斧,執(zhí)行的也是殺龍任務,也可以將xml里面的配置改為拯救少女睁冬,可能這個騎士他不喜歡拯救少女吧挎春。


法師不吟唱

這個例子 初步展示了DI看疙、AOP的思想。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末直奋,一起剝皮案震驚了整個濱河市能庆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阔逼,死亡現(xiàn)場離奇詭異,居然都是意外死亡渠旁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門船逮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顾腊,“玉大人,你說我怎么就攤上這事挖胃≡影校” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵酱鸭,是天一觀的道長吗垮。 經(jīng)常有香客問我,道長凹髓,這世上最難降的妖魔是什么烁登? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮扁誓,結(jié)果婚禮上防泵,老公的妹妹穿的比我還像新娘蚀之。我一直安慰自己蝗敢,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布足删。 她就那樣靜靜地躺著寿谴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪失受。 梳的紋絲不亂的頭發(fā)上讶泰,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音拂到,去河邊找鬼痪署。 笑死,一個胖子當著我的面吹牛兄旬,可吹牛的內(nèi)容都是我干的狼犯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悯森!你這毒婦竟也來了宋舷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓢姻,失蹤者是張志新(化名)和其女友劉穎祝蝠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幻碱,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡绎狭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了收班。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坟岔。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摔桦,靈堂內(nèi)的尸體忽然破棺而出社付,到底是詐尸還是另有隱情,我是刑警寧澤邻耕,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布鸥咖,位于F島的核電站,受9級特大地震影響兄世,放射性物質(zhì)發(fā)生泄漏啼辣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一御滩、第九天 我趴在偏房一處隱蔽的房頂上張望鸥拧。 院中可真熱鬧,春花似錦削解、人聲如沸富弦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腕柜。三九已至,卻和暖如春矫废,著一層夾襖步出監(jiān)牢的瞬間盏缤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工蓖扑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唉铜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓律杠,卻偏偏與公主長得像潭流,于是被迫代替她去往敵國和親柿赊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

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