美麗涵涵童裝店--說我博客名字,給你們打折!
          隨筆 - 82  文章 - 266  trackbacks - 0
          <2007年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456


          點擊這里給楊愛友發消息
          美麗涵涵童裝店
          說我博客名字,給你們打折!

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章檔案

          好友的BLOG

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          里面有些概念描述或觀點可能不正確,歡迎批評指正。

          1. 使用代理對象將日志等與業務邏輯無關的東西或任務提取出來,設計為一個服務對象,這樣的對象稱之為 切面。
          2. 將日志、安全檢查等這類的動作或服務設計為通用的、不介入特定業務對象的個職責清楚的Aspect對象,這就是所謂的面向切面編程(AOP)。
          3. 在這種編程模式之下,Aspect可以獨立于應用程序之外,在必要的時候,可以介入應用呈現之中提供服務,在不需要相關服務的時候,又可以將這些Aspect直接從應用程序中脫離出來,而應用程序本身不需要修改任何一行程序代碼。
          4. AOP術語:書中提到了9個關鍵術語,分別是Cross-cutting concern、Apect、Advice、Joipoint、Pointcut、Target、Introduction、Proxy、Weave
              像日志、安全檢查這類動作在AOP中稱之為Cross-cutting concern;將散落于各個義務邏輯之中的Cross-cutting  concern收集起來,設計成一個獨立可重用的對象,這個對象稱為Aspect。Cross-cutting concern的具體實現稱之為Advice,包括Cross-cutting concern的行為或要提供的服務;Joipoint、Pointcut這兩個術語分不清,暫時都當作切入點來說吧,就是要執行Advice的時機或叫地方;Target很明白,就是一個Advice被應用的目標對象;Introduction可以對一個以編寫或編譯完的類,在執行時動態增加一些方法或行為,而不用修改這個類的碼在JS中太常見;Weave織入,Advice被應用至目標對象的過程。
          5. Advice實現了Aspect的真正邏輯,具體來說在Java中就是一個類或一個方法。一個類可以有多個Advice。由于織入Targets的時機不同,Spring 提供了不同的Advices接口,如Before Advice、After Advice、Around Advice、Throw Advice,見其名知其意,如Before Advice,是在目標對象或方法執行前執行Advice。
          6. PointCut與Advisor:上面說的各種Advice都是直接織入至代理的接口執行前后,織入實際只定義到對象級別。而利用pointCut和Advisor可以將織入目標定位到具體的方法前后。PointCutAdvisor接口提供PointCut實例,用語定義更細粒度的織入實際,他的第一個實現類是NameMatchMethodPointCutAdvisor,用一個表示式去匹配方法名稱,匹配成功的方法都會織入指定的Advice。
          7. 仔細體會:Spring AOP是通過代理機制來實現的,因而需要建立代理對象。
              Adivice可以理解為想日志、權限判斷之類的動作,通過某些方法將這些動作插入到被代理對象,生成一個新的對象,這個新的對象就是代理對象,這種方式就叫代理機制。
              在Spring中,將多個Adivce放到一個對象中,成為一個通用的服務對象,這叫Aspect,將這個Aspect插入到一組對象或方法中,這個過程就是用的代理機制。
          8. Introduction類似JS中的混合的構造函數/原型方法來構造對象,先定義一個對象,然后再想對象Introduction方法。好象沒什么用途。
          9. 以上實現AOP的代理模式都為靜態代理,它為每一個目標對象都定義一個代理Bean,當項目龐大時這顯然是行不通的。解決方案就是使用動態代理,在AutoProxing中,我們可以通過Bean名稱和PointCut對比,自動為符合條件的目標對象建立代理對象。在我看來,靜態代理確實沒什么用武之地,動態代理能很好的工作。
          10. 以上都是Spring1.0就有的東西,在2.0以后對于AOP功能的實現新增了兩種方式:一種是基于XML Schema的設置;一種 是基于Annotation的支持。看到這里才發現前面的其實沒啥用了,以后就直接用XML Schema方式就是了。
          11. ???Spring的核心是AOP、DI、IOC,他主要是用來管理后臺,當然做為一個MVC框架,自然不得不提供controller功能,而其他的如<spring:bind>之類的標簽很多余,這豈不是在頁面上也偶合進了spring 的東西。
          12. 最后用BeforeAdvice來說明的Spring AOP的用法及原理。
          其他類型的Advice如After Advice、Around Advice、Throw Advice用法都是類似的。
          首先定義目標對象必須實現的接口:
          1 public interface IHello {
          2     public void hello(String name);
          3 }

          定義目標對象,讓其實現IHello接口:
          1 public class HelloSpeaker implements IHello{
          2     public void hello(String name){
          3         System.out.println("Hello, " + name);
          4     }
          5 }

          定義一個Advice,它實現了MethodBeforeAdvice接口:
          Before Advice會 在目標對象的方法執行之前被調用,你需要實現aop.MethodBeforeAdvice接口來定義Before Advice邏輯。該接口只有一個方法before(),就是在目標對象的方法執行前要自行的動作。
          1 public class LogBeforeAdvice implements MethodBeforeAdvice{
          2 private Logger logger = Logger.getLogger(this.getClass().getName());
          3     public void before(Method method, Object[] arg1, Object arg2) throws Throwable {
          4         logger.log(Level.INFO,"method starts" + method);
          5     }
          6 }

          編寫bean定義文件:
           1     <bean id="logBeforeAdvice" class="beforeAdvice.LogBeforeAdvice"/>
           2     <bean id="helloSpeaker" class="beforeAdvice.HelloSpeaker"/>
           3     
           4     <!-- 定義一個bean,它被用來生成代理對象,提供通用服務 -->
           5     <bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
           6         <property name="proxyInterfaces" value="beforeAdvice.IHello"/><!--定義代理時可使用的接口 -->
           7         <property name="target" ref="helloSpeaker"/><!-- 目標對象,如果不定義target,acvice將會用至實現IHello接口的所有類 -->
           8         <property name="interceptorNames"><!-- 設置Adivce實例,可設置一個或多個Advice -->
           9             <list>
          10                 <value>logBeforeAdvice</value>
          11             </list>
          12         </property>
          13     </bean>
          14 <!--注意:在不定義目標方法時,Advice將會用于所有方法之前-->

          最后編寫一個測試程序:
          1 public class SpringAOPDemo {

          3     public static void main(String[] args) {
          4         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
          5         IHello helloProxy = (IHello)ctx.getBean("helloProxy");//根據bean定義文件定義的proxyInterfaces屬性生成HelloSpeaker的代理對象
          6         helloProxy.hello("yangay");
          7     }
          8 }
          從這個例子中可以看到,對于HelloSpeaker來說,它并不知道LogBeforeAdvice的存在,而LogBeforeAdvice也可以運用至其他的對象之上,有效地提供對象的重用性。
          posted on 2007-09-06 00:06 楊愛友 閱讀(1488) 評論(4)  編輯  收藏 所屬分類: java相關技術

          FeedBack:
          # re: spring 2.0使用手冊學習筆記(二)  2007-09-06 15:22 睿不可當
          老是看你的blog 不冒個泡 對不起你
          呵呵  回復  更多評論
            
          # re: spring 2.0使用手冊學習筆記(二)  2007-09-06 23:54 楊愛友
          冒泡,別憋著了,你的地址呢?我還不知道。  回復  更多評論
            
          # re: spring 2.0使用手冊學習筆記(二)  2007-09-07 22:03 zrq
          以上實現AOP的代理模式都為靜態代理,它為每一個目標對象都定義一個代理Bean,當項目龐大時這顯然是行不通的。解決方案就是使用動態代理,在AutoProxing中,我們可以通過Bean名稱和PointCut對比,自動為符合條件的目標對象建立代理對象。在我看來,靜態代理確實沒什么用武之地,動態代理能很好的工作。

          項目越大,越應該使用靜態代理,要不然,出措很難找.  回復  更多評論
            
          # re: spring 2.0使用手冊學習筆記(二)  2008-04-01 09:34 Aspectj
          @zrq
          但是動態代理的性能負載很大,在性能較為敏感的項目上,可能問題更多  回復  更多評論
            
          美麗涵涵童裝店
          親,說我博客名字,給你們打折!
          主站蜘蛛池模板: 建湖县| 通化县| 水富县| 榆树市| 西平县| 东宁县| 晋宁县| 莱芜市| 香格里拉县| 山西省| 黑龙江省| 绥德县| 天津市| 彭水| 松原市| 抚远县| 宜兴市| 娱乐| 体育| 简阳市| 剑河县| 偃师市| 旌德县| 黔南| 田阳县| 郓城县| 延庆县| 儋州市| 德兴市| 安塞县| 弋阳县| 平塘县| 锡林浩特市| 双城市| 仪陇县| 柯坪县| 塔城市| 新民市| 梁山县| 无为县| 永定县|