逝去的青春

          勇往直前

          2006年3月30日 #

          回調函數在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 @ 2006-03-30 21:57 逝去的年華 閱讀(1466) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 武胜县| 嵩明县| 福建省| 左贡县| 平度市| 磴口县| 正宁县| 阜城县| 衡南县| 华阴市| 长汀县| 沙坪坝区| 古浪县| 多伦县| 浑源县| 交口县| 昌平区| 五家渠市| 盐池县| 始兴县| 灵宝市| 上虞市| 金山区| 蒙自县| 郁南县| 哈尔滨市| 金秀| 盐源县| 靖宇县| 麟游县| 龙江县| 简阳市| 藁城市| 东乌珠穆沁旗| 山阴县| 长汀县| 卫辉市| 庄浪县| 吉木萨尔县| 兴国县| 涡阳县|