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

          常用鏈接

          留言簿(19)

          隨筆檔案(115)

          文章檔案(4)

          新聞檔案(1)

          成員連接

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

            引介(Introduction)是指在不更改源代碼的情況,給一個(gè)現(xiàn)有類增加屬性、方法,以及讓現(xiàn)有類實(shí)現(xiàn)其它接口或指定其它父類等,從而改變類的靜態(tài)結(jié)構(gòu)。Spring AOP通過(guò)采代理加攔截器的方式來(lái)實(shí)現(xiàn)的,可以通過(guò)攔截器機(jī)制使一個(gè)實(shí)有類實(shí)現(xiàn)指定的接口。
            在實(shí)際應(yīng)用中可以使用DefaultIntroductionAdvisor來(lái)配置引介,也可以直接繼承DefaultIntroductionAdvisor來(lái)實(shí)現(xiàn)引介。這里是昨天在《深入Spring 2:輕量級(jí)J2EE開(kāi)發(fā)框架原理與實(shí)踐》中作的一個(gè)示例。總體感覺(jué)代理攔截機(jī)制實(shí)現(xiàn)的引介,達(dá)到類似于AspectJ那樣的語(yǔ)言擴(kuò)展方式實(shí)現(xiàn)的AOP引介的火力還差很多。
            示例是一個(gè)模擬Warcraft的小游戲,包括英雄、道具、技能、戰(zhàn)場(chǎng)(地圖)等。整個(gè)示例UML圖如下所示:
            
            
            示例中的英雄、地圖及各自持有的道具等全部通過(guò)在Spring配置文件中設(shè)置。下面是配置文件中英雄及戰(zhàn)場(chǎng)的部分:
          <!--10級(jí)角色引介-->
          <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級(jí)山丘之王" />
          ????<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> 
          ?
            通過(guò)配置可以看出,通過(guò)使用引介讓superHero(也即10級(jí)山丘之王)實(shí)現(xiàn)了SuperHero接口,這樣使得概率出招成功的技能具有100%的出招成功率。
            比如,下面是重?fù)艏寄艿拇a:
            
          import java.util.Random;
          //重?fù)艏寄埽哂?0%的概率,可以增加英雄的攻擊力20點(diǎn),如果角色變?yōu)镾uperHero,則重?fù)?00%成功
          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 "重?fù)艏寄埽? + (haveHit ? "傷害提高了20點(diǎn)" : "未使出來(lái)");
          ?}
          }
            通過(guò)代碼可以看出來(lái),如果英雄是SuperHero(即10級(jí)角色),則出招成功率100%,否則只有20%多。SuperHero只是一個(gè)標(biāo)識(shí)接口,內(nèi)容如下:
            public interface SuperHero {
            }
          ?
            我們重點(diǎn)看看SuperHeroIntroductionAdvisor,這個(gè)引介就是讓某一個(gè)現(xiàn)有的對(duì)象實(shí)現(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)在我們來(lái)討Spring AOP中引介的問(wèn)題。假如我們的程序需要在Hero上有一個(gè)增強(qiáng),然后通過(guò)Hero的實(shí)現(xiàn)BaseHero自身來(lái)發(fā)出技能,也即在BaseHero中包含調(diào)用Bash的代碼,則該引介將會(huì)失效。這是因?yàn)楫?dāng)Hero自身調(diào)用的時(shí)候,已經(jīng)不再是通過(guò)代理對(duì)象調(diào)用,而是通過(guò)目標(biāo)對(duì)象Hero本身來(lái)調(diào)用,所有代理攔截都將失效,包括引介。
          ?
            假如你是在Hero之外的另外一個(gè)攔截中來(lái)調(diào)用Bash,也就是說(shuō)想讓一個(gè)引介外的攔截跟引介混合使用,則引介同樣失效。由于引介的失效,所以造成Bash認(rèn)不出來(lái)SuperHero角色,這就是為什么10級(jí)山丘之王的重?fù)艏寄懿荒?00%發(fā)出的原因。
          ?
            代理攔截引介實(shí)際上是代理類實(shí)現(xiàn)指定接口,并沒(méi)有改變實(shí)際的類,比如不會(huì)因?yàn)閟uperHero引入了SuperHero接口而對(duì)其它的Hero造成影響。另外注意的是,Spring AOP中的引介不能和任何切入點(diǎn)一起使用,因?yàn)樗菓?yīng)用在類級(jí)別而不是方法級(jí)別。
          ?
            確保是在代理對(duì)象上調(diào)用引介模塊,而不是在目標(biāo)對(duì)象。下面是修正后的山丘之王的作戰(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級(jí)山丘之王,生命值:500,基本防御:1]
          戰(zhàn)斗開(kāi)始......
          第1回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動(dòng)攻擊![命中:失敗]
          第2回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Priestess of the Moon:500]-[Mountain King:500]
          基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:81]
          Mountain King--基本護(hù)甲:2;物品保護(hù)卷軸,護(hù)甲增加了2點(diǎn);[實(shí)際防御:4]
          實(shí)際傷害點(diǎn)數(shù):77
          第3回合:玩家[10級(jí)山丘之王]向[Mountain King]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[10級(jí)山丘之王:500]-[Mountain King:423]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽瑐μ岣吡?0點(diǎn);物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:101]
          Mountain King--基本護(hù)甲:2;物品保護(hù)卷軸,護(hù)甲增加了2點(diǎn);[實(shí)際防御:4]
          實(shí)際傷害點(diǎn)數(shù):97
          第4回合:玩家[Mountain King]向[10級(jí)山丘之王]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Mountain King:326]-[10級(jí)山丘之王:500]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽瑐μ岣吡?0點(diǎn);[實(shí)際攻攻擊力:80]
          10級(jí)山丘之王--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):78
          第5回合:玩家[Priestess of the Moon]向[10級(jí)山丘之王]發(fā)動(dòng)攻擊![命中:失敗]
          第6回合:玩家[10級(jí)山丘之王]向[Mountain King]發(fā)動(dòng)攻擊![命中:失敗]
          第7回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Mountain King:326]-[Priestess of the Moon:500]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽词钩鰜?lái);[實(shí)際攻攻擊力:60]
          Priestess of the Moon--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):58
          第8回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動(dòng)攻擊![命中:失敗]
          第9回合:玩家[10級(jí)山丘之王]向[Mountain King]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[10級(jí)山丘之王:422]-[Mountain King:326]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽瑐μ岣吡?0點(diǎn);物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:101]
          Mountain King--基本護(hù)甲:2;物品保護(hù)卷軸,護(hù)甲增加了2點(diǎn);[實(shí)際防御:4]
          實(shí)際傷害點(diǎn)數(shù):97
          第10回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動(dòng)攻擊![命中:失敗]
          第11回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Priestess of the Moon:442]-[Mountain King:229]
          基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:81]
          Mountain King--基本護(hù)甲:2;物品保護(hù)卷軸,護(hù)甲增加了2點(diǎn);[實(shí)際防御:4]
          實(shí)際傷害點(diǎn)數(shù):77
          第12回合:玩家[10級(jí)山丘之王]向[Priestess of the Moon]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[10級(jí)山丘之王:422]-[Priestess of the Moon:442]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽瑐μ岣吡?0點(diǎn);物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:101]
          Priestess of the Moon--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):99
          第13回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Mountain King:152]-[Priestess of the Moon:343]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽词钩鰜?lái);[實(shí)際攻攻擊力:60]
          Priestess of the Moon--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):58
          第14回合:玩家[Priestess of the Moon]向[10級(jí)山丘之王]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Priestess of the Moon:285]-[10級(jí)山丘之王:422]
          基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:81]
          10級(jí)山丘之王--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):79
          第15回合:玩家[10級(jí)山丘之王]向[Priestess of the Moon]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[10級(jí)山丘之王:343]-[Priestess of the Moon:285]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽瑐μ岣吡?0點(diǎn);物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:101]
          Priestess of the Moon--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):99
          第16回合:玩家[Mountain King]向[10級(jí)山丘之王]發(fā)動(dòng)攻擊![命中:失敗]
          第17回合:玩家[Priestess of the Moon]向[10級(jí)山丘之王]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Priestess of the Moon:186]-[10級(jí)山丘之王:343]
          基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:81]
          10級(jí)山丘之王--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):79
          第18回合:玩家[10級(jí)山丘之王]向[Mountain King]發(fā)動(dòng)攻擊![命中:失敗]
          第19回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Mountain King:152]-[Priestess of the Moon:186]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽瑐μ岣吡?0點(diǎn);[實(shí)際攻攻擊力:80]
          Priestess of the Moon--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):78
          第20回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動(dòng)攻擊![命中:失敗]
          第21回合:玩家[10級(jí)山丘之王]向[Mountain King]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[10級(jí)山丘之王:264]-[Mountain King:152]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽瑐μ岣吡?0點(diǎn);物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:101]
          Mountain King--基本護(hù)甲:2;物品保護(hù)卷軸,護(hù)甲增加了2點(diǎn);[實(shí)際防御:4]
          實(shí)際傷害點(diǎn)數(shù):97
          第22回合:玩家[Mountain King]向[Priestess of the Moon]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Mountain King:55]-[Priestess of the Moon:108]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽瑐μ岣吡?0點(diǎn);[實(shí)際攻攻擊力:80]
          Priestess of the Moon--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):78
          第23回合:玩家[Priestess of the Moon]向[Mountain King]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[Priestess of the Moon:30]-[Mountain King:55]
          基本傷害:60;英雄持有以下攻擊道具:物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:81]
          Mountain King--基本護(hù)甲:2;物品保護(hù)卷軸,護(hù)甲增加了2點(diǎn);[實(shí)際防御:4]
          實(shí)際傷害點(diǎn)數(shù):77
          英雄 Mountain King 掛了
          第24回合:玩家[10級(jí)山丘之王]向[Priestess of the Moon]發(fā)動(dòng)攻擊![命中:成功]
          生命值--[10級(jí)山丘之王:264]-[Priestess of the Moon:30]
          基本傷害:60;英雄持有以下攻擊道具:重?fù)艏寄埽瑐μ岣吡?0點(diǎn);物品野獸卷軸,攻擊增加了25%;強(qiáng)擊光環(huán)技能,攻擊力增加了10%;[實(shí)際攻攻擊力:101]
          Priestess of the Moon--基本護(hù)甲:1;專注光環(huán)技能,護(hù)甲增加了1點(diǎn)!;[實(shí)際防御:2]
          實(shí)際傷害點(diǎn)數(shù):99
          英雄 Priestess of the Moon 掛了

          最終勝利者:10級(jí)山丘之王

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

          (本文作者:EasyJF開(kāi)源團(tuán)隊(duì)??大峽 轉(zhuǎn)載請(qǐng)保留作者聲明,謝謝!)
          posted on 2006-11-01 18:42 簡(jiǎn)易java框架 閱讀(1490) 評(píng)論(3)  編輯  收藏

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 镇原县| 灵丘县| 突泉县| 无极县| 化德县| 吉安县| 汽车| 芒康县| 承德市| 禹州市| 铜川市| 湟中县| 万荣县| 浮山县| 本溪| 读书| 无为县| 右玉县| 江川县| 永川市| 青岛市| 克东县| 临城县| 伊宁市| 唐河县| 明光市| 白朗县| 封开县| 紫云| 凤阳县| 毕节市| 和顺县| 方城县| 西盟| 栖霞市| 旺苍县| 乡宁县| 肇东市| 揭阳市| 岑巩县| 苍梧县|