<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 115  文章 - 481  trackbacks - 0
    <2006年11月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    常用鏈接

    留言簿(19)

    隨筆檔案(115)

    文章檔案(4)

    新聞檔案(1)

    成員連接

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

      引介(Introduction)是指在不更改源代碼的情況,給一個現(xiàn)有類增加屬性、方法,以及讓現(xiàn)有類實現(xiàn)其它接口或指定其它父類等,從而改變類的靜態(tài)結(jié)構(gòu)。Spring AOP通過采代理加攔截器的方式來實現(xiàn)的,可以通過攔截器機制使一個實有類實現(xiàn)指定的接口。
      在實際應(yīng)用中可以使用DefaultIntroductionAdvisor來配置引介,也可以直接繼承DefaultIntroductionAdvisor來實現(xiàn)引介。這里是昨天在《深入Spring 2:輕量級J2EE開發(fā)框架原理與實踐》中作的一個示例。總體感覺代理攔截機制實現(xiàn)的引介,達到類似于AspectJ那樣的語言擴展方式實現(xiàn)的AOP引介的火力還差很多。
      示例是一個模擬Warcraft的小游戲,包括英雄、道具、技能、戰(zhàn)場(地圖)等。整個示例UML圖如下所示:
      
      
      示例中的英雄、地圖及各自持有的道具等全部通過在Spring配置文件中設(shè)置。下面是配置文件中英雄及戰(zhàn)場的部分:
    <!--10級角色引介-->
    <bean id="superHeroIntroduction"
    ??class="springroad.demo.chap5.wow.SuperHeroIntroductionAdvisor" />
    ?
      <!--代理配置模板-->
    ?<bean id="baseHeroProxy"
    ??class="org.springframework.aop.framework.ProxyFactoryBean"
    ??abstract="true">
    ??<property name="proxyInterfaces"
    ???value="springroad.demo.chap5.wow.Hero" />
    ??<property name="interceptorNames">
    ???<list>
    ????<value>gameRecordAspect</value>
    ????<value>armorAspect</value>????
    ???</list>
    ??</property>
    ?</bean>
    ?<!--定義英雄-->
    ?<bean id="MK" parent="baseHeroProxy">
    ??<property name="target">
    ???<bean class="springroad.demo.chap5.wow.BaseHero">
    ????<constructor-arg value="60" />
    ????<property name="armor" value="2" />
    ????<property name="health" value="500" />
    ????<property name="name" value="Mountain King" />
    ????<property name="auraAndSkill">
    ?????<list>
    ??????<ref bean="bash" />
    ??????<ref bean="scrollOfProtection" />
    ?????</list>
    ????</property>
    ???</bean>
    ??</property>
    ?</bean>
    ?<bean id="POM" parent="baseHeroProxy">
    ??<property name="target">
    ???<bean class="springroad.demo.chap5.wow.BaseHero">
    ????<constructor-arg value="60" />
    ????<property name="armor" value="1" />
    ????<property name="health" value="500" />
    ????<property name="name" value="Priestess of the Moon" />
    ????<property name="auraAndSkill">
    ?????<list>
    ??????<ref bean="devotionAura" />
    ??????<ref bean="scrollOftheBeast" />
    ??????<ref bean="trueshotAura" />
    ?????</list>
    ????</property>
    ???</bean>
    ??</property>
    ?</bean>
    ?<bean id="superHero" parent="baseHeroProxy">
    ??<property name="target">
    ???<bean class="springroad.demo.chap5.wow.BaseHero">
    ????<constructor-arg value="60" />
    ????<property name="armor" value="1" />
    ????<property name="health" value="500" />
    ????<property name="name" value="10級山丘之王" />
    ????<property name="auraAndSkill">
    ?????<list>
    ??????<ref bean="bash" />
    ??????<ref bean="devotionAura" />
    ??????<ref bean="scrollOftheBeast" />
    ??????<ref bean="trueshotAura" />
    ?????</list>
    ????</property>
    ???</bean>
    ??</property>
    ??<property name="interceptorNames">
    ???<list>
    ????<value>gameRecordAspect</value>
    ????<value>armorAspect</value>???
    ????<value>superHeroIntroduction</value>
    ???</list>
    ??</property>
    ?</bean>
    ?<bean id="WarField"
    ??class="org.springframework.aop.framework.ProxyFactoryBean">
    ??<property name="target">
    ???<bean class="springroad.demo.chap5.wow.WarField">
    ????<property name="heros">
    ?????<set>
    ??????<ref bean="MK" />
    ??????<ref bean="POM" />
    ??????<ref bean="superHero" />
    ?????</set>
    ????</property>
    ???</bean>
    ??</property>
    ??<property name="interceptorNames">
    ???<list>
    ????<value>warAspect</value>
    ???</list>
    ??</property>
    ?</bean> 
    ?
      通過配置可以看出,通過使用引介讓superHero(也即10級山丘之王)實現(xiàn)了SuperHero接口,這樣使得概率出招成功的技能具有100%的出招成功率。
      比如,下面是重擊技能的代碼:
      
    import java.util.Random;
    //重擊技能,具有20%的概率,可以增加英雄的攻擊力20點,如果角色變?yōu)镾uperHero,則重擊100%成功
    public class Bash implements AttackProp {
    ?private boolean haveHit;
    ?private Random random = new Random();
    ?public int getAttack(Hero hero) {
    ??if (bigHit() || (hero instanceof SuperHero)) {
    ???haveHit = true;
    ??} else {
    ???haveHit = false;
    ??}
    ??return (haveHit ? 20 : 0);
    ?}
    ?public boolean bigHit() {
    ??int rat = random.nextInt(10);
    ?//?System.out.println(rat);
    ??return (rat <= 2);
    ?}
    ?public String toString() {
    ??return "重擊技能," + (haveHit ? "傷害提高了20點" : "未使出來");
    ?}
    }
      通過代碼可以看出來,如果英雄是SuperHero(即10級角色),則出招成功率100%,否則只有20%多。SuperHero只是一個標(biāo)識接口,內(nèi)容如下:
      public interface SuperHero {
      }
    ?
      我們重點看看SuperHeroIntroductionAdvisor,這個引介就是讓某一個現(xiàn)有的對象實現(xiàn)指定接口。代碼如下示:
    import org.springframework.aop.support.DefaultIntroductionAdvisor;
    import org.springframework.aop.support.DelegatingIntroductionInterceptor;
    public class SuperHeroIntroductionAdvisor extends DefaultIntroductionAdvisor {
    ?public SuperHeroIntroductionAdvisor() {
    ??super(new DelegatingIntroductionInterceptor(new SuperHero(){}), SuperHero.class);
    ?}
    }
      現(xiàn)在我們來討Spring AOP中引介的問題。假如我們的程序需要在Hero上有一個增強,然后通過Hero的實現(xiàn)BaseHero自身來發(fā)出技能,也即在BaseHero中包含調(diào)用Bash的代碼,則該引介將會失效。這是因為當(dāng)Hero自身調(diào)用的時候,已經(jīng)不再是通過代理對象調(diào)用,而是通過目標(biāo)對象Hero本身來調(diào)用,所有代理攔截都將失效,包括引介。
    ?
      假如你是在Hero之外的另外一個攔截中來調(diào)用Bash,也就是說想讓一個引介外的攔截跟引介混合使用,則引介同樣失效。由于引介的失效,所以造成Bash認不出來SuperHero角色,這就是為什么10級山丘之王的重擊技能不能100%發(fā)出的原因。
    ?
      代理攔截引介實際上是代理類實現(xiàn)指定接口,并沒有改變實際的類,比如不會因為superHero引入了SuperHero接口而對其它的Hero造成影響。另外注意的是,Spring AOP中的引介不能和任何切入點一起使用,因為它是應(yīng)用在類級別而不是方法級別。
    ?
      確保是在代理對象上調(diào)用引介模塊,而不是在目標(biāo)對象。下面是修正后的山丘之王的作戰(zhàn)記錄:
    ?
    log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory).
    log4j:WARN Please initialize the log4j system properly.
    [英雄名稱:Mountain King,生命值:500,基本防御:2]
    [英雄名稱:Priestess of the Moon,生命值:500,基本防御:1]
    [英雄名稱:10級山丘之王,生命值:500,基本防御:1]
    戰(zhàn)斗開始......
    第1回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動攻擊![命中:失敗]
    第2回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動攻擊![命中:成功]
    生命值--[Priestess of the Moon:500]-[Mountain King:500]
    基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:81]
    Mountain King--基本護甲:2;物品保護卷軸,護甲增加了2點;[實際防御:4]
    實際傷害點數(shù):77
    第3回合:玩家[10級山丘之王]向[Mountain King]發(fā)動攻擊![命中:成功]
    生命值--[10級山丘之王:500]-[Mountain King:423]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,傷害提高了20點;物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:101]
    Mountain King--基本護甲:2;物品保護卷軸,護甲增加了2點;[實際防御:4]
    實際傷害點數(shù):97
    第4回合:玩家[Mountain King]向[10級山丘之王]發(fā)動攻擊![命中:成功]
    生命值--[Mountain King:326]-[10級山丘之王:500]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,傷害提高了20點;[實際攻攻擊力:80]
    10級山丘之王--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):78
    第5回合:玩家[Priestess of the Moon]向[10級山丘之王]發(fā)動攻擊![命中:失敗]
    第6回合:玩家[10級山丘之王]向[Mountain King]發(fā)動攻擊![命中:失敗]
    第7回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動攻擊![命中:成功]
    生命值--[Mountain King:326]-[Priestess of the Moon:500]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,未使出來;[實際攻攻擊力:60]
    Priestess of the Moon--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):58
    第8回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動攻擊![命中:失敗]
    第9回合:玩家[10級山丘之王]向[Mountain King]發(fā)動攻擊![命中:成功]
    生命值--[10級山丘之王:422]-[Mountain King:326]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,傷害提高了20點;物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:101]
    Mountain King--基本護甲:2;物品保護卷軸,護甲增加了2點;[實際防御:4]
    實際傷害點數(shù):97
    第10回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動攻擊![命中:失敗]
    第11回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動攻擊![命中:成功]
    生命值--[Priestess of the Moon:442]-[Mountain King:229]
    基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:81]
    Mountain King--基本護甲:2;物品保護卷軸,護甲增加了2點;[實際防御:4]
    實際傷害點數(shù):77
    第12回合:玩家[10級山丘之王]向[Priestess of the Moon]發(fā)動攻擊![命中:成功]
    生命值--[10級山丘之王:422]-[Priestess of the Moon:442]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,傷害提高了20點;物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:101]
    Priestess of the Moon--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):99
    第13回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動攻擊![命中:成功]
    生命值--[Mountain King:152]-[Priestess of the Moon:343]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,未使出來;[實際攻攻擊力:60]
    Priestess of the Moon--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):58
    第14回合:玩家[Priestess of the Moon]向[10級山丘之王]發(fā)動攻擊![命中:成功]
    生命值--[Priestess of the Moon:285]-[10級山丘之王:422]
    基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:81]
    10級山丘之王--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):79
    第15回合:玩家[10級山丘之王]向[Priestess of the Moon]發(fā)動攻擊![命中:成功]
    生命值--[10級山丘之王:343]-[Priestess of the Moon:285]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,傷害提高了20點;物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:101]
    Priestess of the Moon--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):99
    第16回合:玩家[Mountain King]向[10級山丘之王]發(fā)動攻擊![命中:失敗]
    第17回合:玩家[Priestess of the Moon]向[10級山丘之王]發(fā)動攻擊![命中:成功]
    生命值--[Priestess of the Moon:186]-[10級山丘之王:343]
    基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:81]
    10級山丘之王--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):79
    第18回合:玩家[10級山丘之王]向[Mountain King]發(fā)動攻擊![命中:失敗]
    第19回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動攻擊![命中:成功]
    生命值--[Mountain King:152]-[Priestess of the Moon:186]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,傷害提高了20點;[實際攻攻擊力:80]
    Priestess of the Moon--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):78
    第20回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動攻擊![命中:失敗]
    第21回合:玩家[10級山丘之王]向[Mountain King]發(fā)動攻擊![命中:成功]
    生命值--[10級山丘之王:264]-[Mountain King:152]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,傷害提高了20點;物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:101]
    Mountain King--基本護甲:2;物品保護卷軸,護甲增加了2點;[實際防御:4]
    實際傷害點數(shù):97
    第22回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動攻擊![命中:成功]
    生命值--[Mountain King:55]-[Priestess of the Moon:108]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,傷害提高了20點;[實際攻攻擊力:80]
    Priestess of the Moon--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):78
    第23回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動攻擊![命中:成功]
    生命值--[Priestess of the Moon:30]-[Mountain King:55]
    基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:81]
    Mountain King--基本護甲:2;物品保護卷軸,護甲增加了2點;[實際防御:4]
    實際傷害點數(shù):77
    英雄 Mountain King 掛了
    第24回合:玩家[10級山丘之王]向[Priestess of the Moon]發(fā)動攻擊![命中:成功]
    生命值--[10級山丘之王:264]-[Priestess of the Moon:30]
    基本傷害:60;英雄持有以下攻擊道具:重擊技能,傷害提高了20點;物品野獸卷軸,攻擊增加了25%;強擊光環(huán)技能,攻擊力增加了10%;[實際攻攻擊力:101]
    Priestess of the Moon--基本護甲:1;專注光環(huán)技能,護甲增加了1點!;[實際防御:2]
    實際傷害點數(shù):99
    英雄 Priestess of the Moon 掛了

    最終勝利者:10級山丘之王

    相關(guān)文章《有誰知道10級的山丘之王是怎么死的?

    (本文作者:EasyJF開源團隊??大峽 轉(zhuǎn)載請保留作者聲明,謝謝!)
    posted on 2006-11-01 18:42 簡易java框架 閱讀(1483) 評論(3)  編輯  收藏

    FeedBack:
    # re: 從山丘錘王之死談Spring AOP中的引介(Introduction)  2006-11-01 18:55 布衣郎
    不錯,樓主的例子講的很不錯。
    引入其實就是aop靜態(tài)橫切,不改變原有的結(jié)構(gòu),而增加新的接口。
    2.0好像支持declare parents了  回復(fù)  更多評論
      
    # re: 從山丘錘王之死談Spring AOP中的引介(Introduction)  2006-11-02 14:17 fef
    中國軟件業(yè)的發(fā)展不缺人才也不缺資金,缺的是人才的組織和管理,MyLinux平臺的建設(shè)解決了軟件人才的組織和管理問題,將每一項目最合適的軟件開發(fā)人才以最有效率的形式組織在一起,從而取得1+1〉2的效果。
    Mylinux網(wǎng)站采用會員積分制度,使用積分可以在Mylinux網(wǎng)站的項目招投標(biāo)系統(tǒng)中參與投標(biāo)競標(biāo),累計積分可以在Mylinux簽約的電子商務(wù)網(wǎng)站上進行消費。Mylinux網(wǎng)站將同廣泛的電子商務(wù)購物網(wǎng)站進行簽約合作,凡網(wǎng)站會員積分可在簽約商戶自由購物,并享受貴賓折扣待遇。
      回復(fù)  更多評論
      
    # re: 從山丘錘王之死談Spring AOP中的引介(Introduction)  2006-11-02 15:42 簡易java框架
    @布衣郎
    Spring AOP的底層還是代理攔截機制,可以使用AspectJ的一些語法來聲明切入點,聲明引介如“declare parents”,但是還要要由代理攔截來處理的!不過Spring可以使用AspectJ的類加載器織入,這樣就能使用AspectJ的全部功能了。呵呵,實際項目中用Spring提供的應(yīng)該就夠了。   回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲色爱图小说专区| 成年女人18级毛片毛片免费观看| 免费在线观看理论片| 亚洲国产乱码最新视频| 91香蕉成人免费网站| 亚洲国产精品人久久电影| 91精品国产免费入口| 亚洲国产女人aaa毛片在线 | 日韩激情无码免费毛片| 久草免费福利在线| 亚洲最大激情中文字幕| 国产在线国偷精品免费看| 午夜一区二区免费视频| 国产精品久久香蕉免费播放| 日本在线高清免费爱做网站| 亚洲日本国产精华液| 在线观看无码AV网站永久免费| 亚洲第一成人在线| 国产AV无码专区亚洲精品| 成人免费av一区二区三区| 国产亚洲AV夜间福利香蕉149| 成人无码a级毛片免费| 亚洲视频精品在线| 99久久这里只精品国产免费| 亚洲乱码av中文一区二区| 国产美女精品视频免费观看| 一个人看的hd免费视频| 亚洲Av无码精品色午夜| 1000部夫妻午夜免费 | 亚洲天堂一区二区三区| 成人免费无码大片A毛片抽搐色欲 成人免费无码大片a毛片 | 成年女人免费v片| 人妻仑乱A级毛片免费看| 久久被窝电影亚洲爽爽爽| 亚洲视频免费在线看| 亚洲AV成人片无码网站| 国产亚洲精品不卡在线| 亚洲精品免费网站| 一级毛片在线免费播放| 久久久亚洲欧洲日产国码aⅴ | 精品亚洲成在人线AV无码|