JAVA技术
返回
登录/注册
两者并非完全等效:Java EE对比Spring
楼主
chongxiao20 于 2013-03-23 14:49:53
两者并非完全等效: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]
回复
1
电脑版
Page created in 0.0312 seconds with 2 queries.