逝去的青春

          勇往直前

          回調函數在Spring中的使用

          ?? 這是一種對單個方法的參數使用控制反轉,把控制權和差錯處理交給框架來處理。嚴格的說,這是一種Strategy模式的特例,他們的區別就在于接口的復雜度不同。
          ?? 在Spring的JdbcTemplate中就使用了這種模式。JdbcTemplate實現了query()方法,參數是SQL字符串,和一個實現了回調接口的,將在讀取resultSet每行時被調用。

          1 public ? interface ?RowCallbackHandler?
          2 {
          3 ???? void ?processRow(ResultSet?rs)? throws ?SQLException;
          4 }
          ?


          ? query()方法封裝了對JDBC底層API的調用。

          public ? void ?query(String?sql,?RowCallbackHandler?callbackHandler)? throws ?JdbcSqlException?
          {
          ????Connection?con?
          = ? null ;
          ????PreparedStatement?ps?
          = ? null ;
          ????ResultSet?rs?
          = ? null ;
          ????
          try ?
          ????
          {
          ????????con?
          = ? < code?to?get?connection >
          ????????ps?
          = ?con.prepareStatement?(sql);
          ????????rs?
          = ?ps.executeQuery();
          ????????
          while ?(rs.next())?
          ????????
          {
          ????????????callbackHandler.processRow(rs);
          ????????}

          ????????rs.close();
          ????????ps.close();
          ????}
          ?
          ????
          catch ?(SQLException?ex)?
          ????
          {
          ????????
          throw ? new ?JdbcSqlException( " Couldn't?run?query?[ " ? + ?sql? + ? " ] " ,?ex);
          ????}

          ????
          finally ?
          ????
          {
          ????????DataSourceUtils.closeConnectionIfNecessary(
          this .dataSource,?con);
          ????}

          }


          ?? 在上面的例子中,JdbcSqlException繼承了java.lang.RuntimeException,也就是說調用者可以選擇去捕獲它,但是這不是必須的。假如實現了回調接口的子類里的方法出錯,而且不是RuntimeException的子類,也就是必須捕獲的異常,但是query()方法中在邏輯上是沒有辦法捕獲它的。所以Rod_Johnson把接口定義成JdbcTemplate的inner interface。這就可以JdbcTemplate就可以捕獲它。
          ?? 回調方法也是框架的一種基本方法,比如java.io.File類中的listFiles(FilenameFilter filter),FilenameFilter就是一個接口,我們實現這個接口中的方法accept(File dir, String name) ,這就是一個典型的回調方法。
          ?? 觀察者模式的使用符合開閉原則,并且分離了關注點。這種對模塊修改開發,影響關閉的原則促進了AOP面向方面編程的發展。Spring中的AOP可能就是這種思想的實現,個人猜測而已。????
          ??? 把方法的參數放在一個類中,這樣以后要增加參數的話,不用修改方法簽名,感覺很干凈,唯一可能的缺點是可能對性能有所下降,不過很小。如果沒有用EJB的話,應該差不多。

          ?? 對異常的處理,分為checked和unchecked異常,checked異常是繼承java.lang.Exception的。Unchecked異常繼承java.lang.RuntimeException。Rod_Johnson主張在對出現異常后,程序不能處理,只能給予沒用的提示時用RuntimeException,因為RuntimeException容器會自動處理。關于異常的詳細說明,我也沒看明白,希望那位大蝦能指點指點。

          備注:本文主要內容來源于Rod_Johnson的大作,強烈建議看原版!

          posted on 2006-03-30 21:57 逝去的年華 閱讀(1466) 評論(0)  編輯  收藏 所屬分類: java


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


          網站導航:
           
          主站蜘蛛池模板: 饶河县| 垫江县| 琼结县| 海盐县| 仙游县| 喀什市| 双鸭山市| 伊通| 英超| 新晃| 峨山| 永宁县| 滦南县| 广德县| 大庆市| 元朗区| 特克斯县| 横山县| 宝丰县| 建宁县| 固原市| 汤阴县| 泽普县| 蒲江县| 肇东市| 若尔盖县| 惠州市| 镶黄旗| 连平县| 武川县| 琼海市| 盘山县| 蒙自县| 大庆市| 济阳县| 夹江县| 佛冈县| 西昌市| 宝兴县| 阳西县| 定陶县|