posts - 22, comments - 17, trackbacks - 0, articles - 15
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          初識AOP

          Posted on 2006-12-02 15:52 碼農cz 閱讀(157) 評論(0)  編輯  收藏 所屬分類: Spring what I know

          AOP是被看做Spring框架中的一個重頭戲。所以介紹一下。

          學習Spring AOP之前,先來了解一下AOP。
          AOP應用到項目中的好處,能夠將與業務邏輯不相關的代碼(如:日志、權限等)分離出來,減小相關業務類負擔,并能讓一些通用需求(如:事務)得到更廣泛的復用。
          AOP的實現是利用了java核心的代理機制,分靜態代理與動態代理。
          靜態代理要求代理對象與被代理對象都實現同一個接口

          ?1??//接口:
          ?2?public?interface?IBusiness{
          ?3?????????public?void?doBusiness();
          ?4?}
          ?5?//實現:
          ?6?public?class?BusinessImpl?implements?IBusiness{
          ?7?????????public?void?doBusiness(){
          ?8?????????????????System.out.println("業務主體部分");
          ?9?????????}
          10?}
          11?//執行器:
          12?public?class?BusinessHandler?implements?InvocationHandler{
          13?????????private?BusinessImpl?bi=null;
          14?????????public?BusinessHandler(BusinessImpl?bi){
          15?????????????????this.bi=bi;
          16?????????}
          17?????????public?Object?invoke(Object?proxy,Method?method,Object[]?args)?throws?Throwable{
          18?????????????????System.out.println("事務、日志、權限等操作");
          19?????????????????method.invoke(bi,args);
          20?????????????????System.out.println("事務、日志、權限等操作");
          21?????????}
          22?????????}
          23?}
          24?//應用:
          25?public?class?AOPAppDemo{
          26?????????public?static?void?main(String[]?args){
          27?????????????????BusinessImple?bi=new?BusinessImple();
          28?????????????????BusinessHandler?bh=new?BusinessHandler(bi);
          29?????????????????IBusiness?proxy=(IBusiness)Proxy.newProxyInstance(bi.getClass().getClassLoader(),bi.getClass().getInterfaces(),bh);
          30???????????????????proxy.doBusiness();
          31?????????}
          32?}

          上述代碼就是通過靜態代理實現了AOP,BusinessProxy代理了BusinessImpl的doBusiness方法。但是靜態代理一般不能滿足我們項目開發的需求,如果業務需求很多它得為每一個業務方法一一做代理,動態代理正好解決了這一缺點,接下來我們來說說動態代理吧。
          動態代理,需實現一個InvocationHandler的接口,重寫invoke(Object proxy,Method method,Object[] args)方法,代理對象實例由Proxy.newProxyInstance(ClassLoader loader,Class interfaces,InvocationHandler h)方法生成,當代理對象的方法被執行時,通知執行器(InvocationHandler)執行invoke(Object proxy,Method method,Object[] args)方法,invoke方法內調用了method.invoke(Object obj,Object... args)方法,該方法對帶有指定參數的指定對象調用由此 Method 對象表示的基礎方法,應該這時才真正代理執行了業務邏輯(這里我是這樣理解的,不知對不對)。
          接下來用代碼說明上述動態代理原理,與靜態代理相比接口與實現保持不變

          ?1?//接口:
          ?2?public?interface ?IBusiness{
          ?3?????????public?void
          ?doBusiness();
          ?4?
          }
          ?5?//實現:

          ?6?public?class?BusinessImpl?implements ?IBusiness{
          ?7?????????public?void
          ?doBusiness(){
          ?8?????????????????System.out.println("業務主體部分"
          );
          ?9?
          ????????}
          10?
          }
          11?//代理:

          12?public?class?BusinessProxy?implements ?IBusiness{
          13?????????private
          ?BusinessImple?bi;
          14?????????public
          ?BusinessProxy(BusinessImple?bi){
          15?????????????????this.bi=
          bi;
          16?
          ????????}
          17?????????public?void
          ?doBusiness(){
          18?????????????????System.out.println("事務、日志、權限等操作"
          );
          19?
          ????????????????bi.doBusiness();
          20?????????????????System.out.println("事務、日志、權限等操作"
          );
          21?
          ????????}
          22?
          }
          23?//應用:

          24?public?class ?AOPAppDemo{
          25?????????public?static?void
          ?main(String[]?args){
          26?????????????????BusinessImpl?bi=new
          ?BusinessImple();
          27?????????????????BusinessProxy?proxy=new
          ?BusinessProxy(bi);
          28?
          ????????????????proxy.doBusiness();
          29?
          ????????}
          30?
          }
          31?

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


          網站導航:
          相關文章:
           
          主站蜘蛛池模板: 宁津县| 敦化市| 双鸭山市| 肇州县| 闵行区| 苗栗市| 伊宁县| 合肥市| 大兴区| 黔南| 江油市| 手机| 特克斯县| 平舆县| 梓潼县| 陆丰市| 锦屏县| 简阳市| 扎囊县| 广汉市| 宁都县| 丰镇市| 永靖县| 浏阳市| 双牌县| 克拉玛依市| 嘉义县| 溆浦县| 哈密市| 昭通市| 东莞市| 大名县| 涡阳县| 越西县| 旬阳县| 宣化县| 南京市| 新昌县| 佛冈县| 凤庆县| 垫江县|