回调,就是A对象调用B对象中的访求A,然后B对象又在某个时候反过来调用A对象中的某个方法B,对于A对象来说,这个B方法便叫做回调函数。
在java中回调函数用接口实现。
java代码:
public interface Person {
void eat();
}
public class Woman {
private Person p;
public void play(Person p){
p.eat();
}
public static void main(String[] args){
Woman w=new Woman();
w.play(new Person(){
@Override
public void eat() {
System.out.println("回调方法执行");
}
});
}
}
回调函数在Spring中的例子:
Spring对jdbc进行了包装,使其使用起来更专注业务,其中jdbcTemplate中有许多方法是回调函数的具体应用:
public Object execute(StatementCallback action) throws DataAccessException //jdbcTemplate的方法{
Assert.notNull(action, "Callback object must not be null");
Connection con = DataSourceUtils.getConnection(getDataSource());
Statement stmt = null;
try {
Connection conToUse = con;
if (this.nativeJdbcExtractor != null &&
this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {
conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
}
stmt = conToUse.createStatement();
applyStatementSettings(stmt);
Statement stmtToUse = stmt;
if (this.nativeJdbcExtractor != null) {
stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
}
Object result = action.doInStatement(stmtToUse);
handleWarnings(stmt);
return result;
}
catch (SQLException ex) {
// Release Connection early, to avoid potential connection pool deadlock
// in the case when the exception translator hasn't been initialized yet.
JdbcUtils.closeStatement(stmt);
stmt = null;
DataSourceUtils.releaseConnection(con, getDataSource());
con = null;
throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
}
finally {
JdbcUtils.closeStatement(stmt);
DataSourceUtils.releaseConnection(con, getDataSource());
}
}
Object doInStatement(Statement stmt) throws SQLException,
DataAccessException //Interface StatementCallback中需要实现的访求
使用方式:
部分代码:
List<String> name=List<String>jdbcTemplate.execute(new StatementCallback(){
public Object doInStatement(Statement stmt) throws SQLException,
DataAccessException{
List<String> name=new ArrayList<String> ();
ResultSet rs=null;
rs=stmt.excuteQuery("select * from emp");
while(rs.next()){
name.add(rs.getString("empname"));
}
return name; //异常代码末写
}
}