java filter 回调_回调函数在Spring中的使用

这是一种对单个方法的参数使用控制反转,把控制权和差错处理交给框架来处理。严格的说,这是一种Strategy模式的特例,他们的区别就在于接口的复杂度不同。

在Spring的JdbcTemplate中就使用了这种模式。JdbcTemplate实现了query()方法,参数是SQL字符串,和一个实现了回调接口的,将在读取resultSet每行时被调用。

1

4f1150b881333f12a311ae9ef34da474.png

public

interface

RowCallbackHandler

2

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

3

d18c02628675d0a2c816449d98bda930.png

void

processRow(ResultSet rs)

throws

SQLException;

4

8f1ba5b45633e9678d1db480c16cae3f.png}

query()方法封装了对JDBC底层API的调用。

4f1150b881333f12a311ae9ef34da474.png

public

void

query(String sql, RowCallbackHandler callbackHandler)

throws

JdbcSqlException

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png    Connection con

=

null

;

d18c02628675d0a2c816449d98bda930.png    PreparedStatement ps

=

null

;

d18c02628675d0a2c816449d98bda930.png    ResultSet rs

=

null

;

d18c02628675d0a2c816449d98bda930.png

try

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png        con

=

<

code to get connection

>

d18c02628675d0a2c816449d98bda930.png        ps

=

con.prepareStatement (sql);

d18c02628675d0a2c816449d98bda930.png        rs

=

ps.executeQuery();

d18c02628675d0a2c816449d98bda930.png

while

(rs.next())

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png            callbackHandler.processRow(rs);

ecedf933ec37d714bd4c2545da43add2.png        }

d18c02628675d0a2c816449d98bda930.png        rs.close();

d18c02628675d0a2c816449d98bda930.png        ps.close();

ecedf933ec37d714bd4c2545da43add2.png    }

d18c02628675d0a2c816449d98bda930.png

catch

(SQLException ex)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

throw

new

JdbcSqlException(

"

Couldn't run query [

"

+

sql

+

"

]

"

, ex);

ecedf933ec37d714bd4c2545da43add2.png    }

d18c02628675d0a2c816449d98bda930.png

finally

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png        DataSourceUtils.closeConnectionIfNecessary(

this

.dataSource, con);

ecedf933ec37d714bd4c2545da43add2.png    }

8f1ba5b45633e9678d1db480c16cae3f.png}

在上面的例子中,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 逝去的年华 阅读(1247) 评论(0)  编辑  收藏 所属分类: java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值