非常感谢你的阅读,如果你觉得好或者对你有帮助,请积极给一个留言反馈以示鼓励。 
         选择一种架构、一种技术的依据是什么? Rod Johnson 认为,应该是基于实践的依据、来自历史项目或亲自试验的经验,而不是任何形式的偶像崇拜或者门户之见。 
如果说 Spring 发起了对 J2EE 常规应用的挑战,那其立足的基础就是实践,把大量实践中的经验累积成一种最佳实践,把这种最佳实践融合到 J2EE 应用的方方面面。 
事实胜于雄辩,用具体的示例进行阐述: 
在 JDBC 操作中,我们用到的无非是增、删、改、查 CRUD4 个功能,每个功能都覆盖了 1 建立连接 2 构造 PrepareStatement 对象 3 进行操作 如果有异常回滚 4 关闭连接。 
以查询为例: 
Connection conn=null; 
PrepareStatement stmt = null; 
ResultSet rs = null; 
List results = null; 
try { 
conn = getConnection(); 
conn.setAutoCommit(false); 
stmt = conn.preparedStatement(sql); 
rs = stmt.executeQuery(); 
results = new ArrayList(); 
while(rs.next()) { 
    Object vo = new Object(); 
    vo.setXX(rs.getXType(fieldName1)); 
    vo.setYY(rs.getYType(fieldName2)); 
       …… 
       results.add(vo); 
} 
} catch(Exception ex) { 
conn.rollback(); 
} finally { 
if (null != rs) rs.clse(); 
if (null != stmt) stmt.clse(); 
if (null != conn) conn.clse(); 
} 
  
对于: 
Object vo = new Object(); 
 vo.setXX(rs.getXType(fieldName1)); 
 vo.setYY(rs.getYType(fieldName2)); 
…… 
我们实际开发中常常使用 rs2VO(Resultset rs) 私有函数来进行转化; 
这个过程, Spring 提供了 RowMapper 接口,其方法是 public Object mapRow ( ResultSet rs, int index )异曲同工。 
对于 while(rs.next()) { 
    Object vo = new Object(); 
    vo.setXX(rs.getXType(fieldName1)); 
    vo.setYY(rs.getYType(fieldName2)); 
       …… 
       results.add(vo); 
} 
这个过程: 
Spring 中用 new RowMapperResultReader(new RowMapper()) 来取代; 
外加其提供的避免大量重复代码的回调函数,因此整个过程最后只剩下: 
jdbcTemplate.query(sql, params, new RowMapperResultReader(new RowMapper())) 
一句话这么简单。 
  
窥一豹而知全斑(当然有全部读完),所以我觉得与其说 Spring 是挑战 J2EE 应用的地位,不如说其是通过大量实践从而提出了更有效的方式,是一种最佳实践的体现. 
因此,Spring 的过程也是论述“循序方法”论述的过程。 
读完:《精通 Spring 》《 Spring In  Action 》《 J2EE without EJB 》和大量网络文章有感。 
Thanks very much to visit blog,  welcome your feedback,  your feedback is the Driver && Power to me