国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java下的框架編程之cglib的應用

2019-11-18 15:33:00
字體:
來源:轉載
供稿:網友

   作者:江南白衣 

   反射、PRoxy和元數據是java最強的三個特征,再加上CGLib (Code Generation Library)和ASM,使得Java雖然沒有Ruby,Python般后生可畏,一樣能做出強悍的框架。

   Proxy可以看作是微型的AOP,明白提供了在繼續和委托之外的第三個代碼封裝途徑,只要有足夠的想象力,可以做得非常好玩,Spring的源碼里用Proxy就用得很隨便,看得我非常眼紅。可惜Proxy必須基于接口。因此Spring的做法,基于接口的用proxy,否則就用cglib。AOP么,一般小事非compoent一級的就不麻煩aspectJ出手了。

    cglib的Enhancer說起來神奇,用起來一頁紙不到就講完了。
    它的原理就是用Enhancer生成一個原有類的子類,并且設置好callback到proxy, 則原有類的每個方法調用都會轉為調用實現了MethodInterceptor接口的proxy的intercept() 函數:

Word-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy)

 在intercept()函數里,你可以在執行Object result=proxy.invokeSuper(o,args);來執行原有函數,在執行前后加入自己的東西,改變它的參數值,也可以瞞天過海,完全干別的。說白了,就是AOP中的around advice。

    AOP沒有出現以前,該領域經典的設計模式是Decorator,像Java IO Stream的設計就是如此.不過,假如為每個DAO, 每個方法的寫Decorator函數會寫死人的,所以用上cglib的好處是一次過攔截所有方法。 

     另外,cglib除了Enhancer之外,還有BulkBean和Transform,都是Hibernate持久化的基礎,但文檔貧乏,一時還沒去看怎么用。

1.AOP里講了一百遍阿一百遍的log aspect在cglib是這樣做的:


   public class LogDAOProxy implements MethodInterceptor
   {
       private Logger log=Logger.getLogger(LogDAOProxy.class);
       private Enhancer enhancer=new Enhancer();
        //返回DAO的子類
       public Object getDAO(Class clz)
       {
           enhancer.setSuperclass(clz);
           enhancer.setCallback(this);
           return enhancer.create();
       }
       //默認的攔截方法
      public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable
      {
           log.info("調用日志方法"+method.getName());
           Object result=proxy.invokeSuper(o,args);
           return result;
      }
   }

    應用的代碼:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 周宁县| 阳高县| 三穗县| 安阳市| 衡水市| 台东市| 临潭县| 滨海县| 象州县| 比如县| 祁门县| 明光市| 西城区| 沾化县| 电白县| 太湖县| 阳城县| 旬邑县| 中山市| 麻栗坡县| 临洮县| 红安县| 卢湾区| 宝兴县| 嫩江县| 娄底市| 玉溪市| 石林| 曲阳县| 阿城市| 洛阳市| 鲁山县| 孙吴县| 托克托县| 延庆县| 东源县| 宜城市| 陵水| 隆子县| 陆良县| 昌都县|