两者并非完全等效:Java EE对比Spring

楼主
两者并非完全等效:Java EE对比Spring
[P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px][LINE-HEIGHT=21px][COLOR=rgb(51, 102, 255)]Java EE[/COLOR][/LINE-HEIGHT]是一个功能强大的平台,在过去几年中已经被简化和优化,可以说Java EE可以做任何事,那么[LINE-HEIGHT=21px][COLOR=rgb(51, 102, 255)]Spring框架[/COLOR][/LINE-HEIGHT][COLOR=#3366ff][LINE-HEIGHT=21px]确实可能是一个重大的错报。前面的我们讲了[/LINE-HEIGHT][/COLOR][LINE-HEIGHT=21px][COLOR=rgb(51, 102, 255)]Spring的流行度[/COLOR][/LINE-HEIGHT][COLOR=#3366ff][LINE-HEIGHT=21px],现在让我们看看Java EE和Spring的比较,确认一些Java EE能做的事情,并且看看Spring如何在旁使用,或者替代他们中的一些API使得开发更完美。[/LINE-HEIGHT][/COLOR][/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  [B]JDBC 4.1和Spring的JdbcTemplate[/B][/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  Java数据库连接([LINE-HEIGHT=21px][COLOR=rgb(51, 102, 255)]JDBC[/COLOR][/LINE-HEIGHT][COLOR=#3366ff][LINE-HEIGHT=21px])API,它早[/LINE-HEIGHT][/COLOR]在1999年,我第一次授课的时候,就已经作为Sun JDK1.0.2课程的辅助材料了,它已经是很多框架的支柱,包括Hibernate和JPA服务规范,MyBatis iBATIS 以及其他很多框架。[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  编写原始的JDBC查询API的时候有两个期望:[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  第一是开发人员必须获得一个连接,创建一个语句,然后处理一个结果集。第二是开发人员必须妥善关闭这些连接,并且处理各种异常,以避免出现资源泄漏。[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  这里有一个典型(Java 7以前)JDBC代码块:[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px][/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][TABLE=transparent,0,6,95%,center,rgb(255, 255, 255),0,none][tr][TD=1,1,#f3f3f3]Connection conn = null;  
Statement statement = null;  
ResultSet rs = null;  
   
try {  
   conn = //let's assume we ask a connection pool for the connection  
              让我们假设为这个连接请求一个连接池
   statement = conn.prepareStatement(“select a, b from foo f where f.c = ?”);  
   statement.setInt(1, 234);  
   rs = statement.executeQuery();  
   while (rs.next()) {  
     // process each row(循环处理每一行)  
   }  
} catch (SqlExceptoin se) {  
   se.printStackTrace();  
} finally {  
   try {  
  // this isn't quite right- you should close each one in a try/catch for safety
     这样做不是特别正确,应该在每一个try/catch中安全的关闭  
     rs.close();  
     stmt.close();  
     conn.close();  
   } catch (Exception e) { ... ? }
  上面的[/td][/tr][/TABLE][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px][/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  代码存在如下一些主要的问题:[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  开发人员必须正确处理异常。finally块很难写好。开发人员必须处理一个受控异常(SqlException),并它作为一个运行时异常重新抛出,或把它扔给堆栈(ick)。[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  这是许多样板的代码。说了这么多,事实上,我们遗漏了while循环调用每一行,取而代之的是一个整理过的评论。[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  [B]Spring的方式[/B][/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  Spring团队创建的第一个API是JdbcTemplate API。基于模板方法的设计模式,一个方法同时为流程提供setup和teardown代码,并且提供了一种方法,从而在安全的代码块中插入逻辑来处理流程,这个API简化了几件事情:[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  开发人员不再需要try / catch异常来处理错误。错误作为运行时异常被扔到堆栈,而不是受控异常。资源在业务逻辑以外分配,所以不可能再出现连接泄漏事件。任何重复使用的代码将调用模板方法本身。[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  JdbcTemplate中相同的代码可能需要几种形式。[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  这是最简单的形式:[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px][/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][TABLE=transparent,0,6,95%,center,rgb(255, 255, 255),0,none][tr][TD=1,1,#f3f3f3]JdbcTemplate template = new JdbcTemplate(connection);  
List<MYABC> template.query(“select a, b from foo f where f.c = ?”, 234,  
             new RowMapper {  
                   public MyAbc mapRow(ResultSet rs, int rowNum)  
                         throws SQLexception {  
                         return new MyAbc(rs.getString(1), rs.getString(2));  
                   }  
             }  
}[/td][/tr][/TABLE][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px][/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  JdbcTemplate的查询方法提供了一个称为RowMapper的API,实现这个接口可以处理每一行。开启和关闭连接,创建和准备语句,甚至是创建并返回一个列表的技术性细节都是由查询方法来处理的。[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  我们甚至有空间显示完整的方法,但是我们没有那么多teardown代码。[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P][P][LINE-HEIGHT=25px][FACE=微软雅黑][COLOR=rgb(51, 51, 51)][BGCOLOR=rgb(255, 255, 255)][SIZE=14px]  本文只是Spring学习的第一部分,精彩内容还将继续,敬请关注。[/SIZE][/BGCOLOR][/COLOR][/FACE][/LINE-HEIGHT][/P]

电脑版 Page created in 0.0312 seconds with 2 queries.