`
yjcoffee
  • 浏览: 11798 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

实现Java语言的领域模型,比较看好Spring Roo

阅读更多

首先说一下这篇文章的目的是想就最近新发布的Spring Roo再谈一下Java语言的领域模型开发,只是发表我对Roo尝试的第一感觉,欢迎大家讨论。

昨天实践了一下Spring Roo,给我的感受不亚于两年前第一次实践Rails的快感。但在网上及论坛上搜了一下对Spring Roo的分析,发现文章不是很多(可能Roo发布时间还不很长)、评价也不是很高,有说Roo只不过是剥离了Groovy的Grails。但就我个人感觉,首先Roo是基于Java语言的(正如Rails基于Ruby和Grails基于Groovy语言一样),但Java特性远不如动态语言Ruby和Groovy灵活。缘于Java是目前企业应用开发的第一语言,多数有着广泛Java基础的公司弃Java选Ruby或Groovy是比较困难的,Hibernate+Spring则在近些年成为企业开发的主流。但是对于基于Spring框架的贫血模型经常被大家所诟病,而就我个人的经验,最近一个基于Spring+Hibernate的项目也让我开始厌恶这种贫血的Service+Dao开发模式。

看了一年前关于Java充血模型的困难,主要难点就是Java语言无法做到像Ruby的mixin和C#的partial等语言特性,另外当时Spring的AspectJ织入还不够强大。但是如今Roo发布以后却让我感觉SpringSource在这方面已经做得非常好了,首先能像rails和grails的代码生成(Tab提示则更为智能)、基于Annotation和AspectJ编译时的织入,很好的将ActiveRecord模式的引入到POJO中(但属于不同编译单元,POJO除了多几个Annotation就只剩field了,连setter/getter也可以通过Annotation在编译时织入),这样很容易使得Entity更加关心属于自身的业务逻辑,因此Service层不再是必要的(需要事物/安全边界或其它目的时选用),DAO层则根本不再建议使用了。

顺便比较一下去年了解的Seams,Seams也是Gavin King大牛的另一大作,但是因其前端标配JSF等因素使得它并没想Hibernate那样流行。虽说Seams在基于JEE标准上使得Java的领域模型做的非常好了,但是它仍旧延续EJB的开发模式,让业务逻辑封装在Session Bean中,而数据则仍然是Entity的主要责任,所以说感觉并不是一个真实的充血模型。

回到Spring Roo,虽然Roo功能目前还不很强大,比如还不能根据配置的数据库链接直接从数据库表来生成Entity,以及前端表示层使用JSP和绑定Spring MVC(基于Spring 3.0支持REST)等,但是这些改进目标已经纳入其roadmap中,毕竟Roo才发布两三个版本,因此个人还是比较看好它的:)

 

分享到:
评论
9 楼 Arden 2011-01-05  
没觉得roo有什么特别的~
8 楼 witcheryne 2011-01-05  
用Roo快速构建一个项目框架非常不错...
http://s3.springsource.com/MRKT/roo/2010-01-Five_Minutes_Roo.mov
这个视频吸引了我
7 楼 yjcoffee 2010-05-21  
<div class="quote_title">hantsy 写道</div>
<div class="quote_div">
<p>在 1. 0 发布之前,了解了一下。。。参见我的博文</p>
<p> </p>
<table style="border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0" width="510"><tbody>
<tr height="18">
<td width="25" align="right">·</td>
<td width="350">
<a class="list1" href="http://blog.chinaunix.net/u/1096/showart_1946865.html" target="_blank"><span style="font-size: 10pt; color: #02368d;"><strong>Spring Roo 再一次亲密接触</strong></span></a>
</td>
<td style="color: #aaaaaa;" width="165">2009-05-28</td>
</tr>
<tr>
<td colspan="3" align="center"><img src="http://blog.chinaunix.net/templates/default/images/right_line.gif" border="0" alt="" width="502" height="9"></td>
</tr>
<tr height="18">
<td width="25" align="right">·</td>
<td width="350">
<a class="list1" href="http://blog.chinaunix.net/u/1096/showart_1918409.html" target="_blank"><span style="font-size: 10pt; color: #02368d;"><strong>Spring Roo 第一次亲密接触</strong></span></a>
</td>
</tr>
</tbody></table>
<p> </p>
<p> </p>
<p>现在 1.1 又加入了不少新特性,特别是支持 GAE和GWT,现在准备写一些补充的文章。</p>
</div>
<p>呵呵,今天早上注意到了,不过是1.1.0.M1,等待1.1.0.RELEASE,好像还得等上数月。。。</p>
<ul class="versionBannerList">
<li id="version-11438" class="  expando">
<div class="versionBanner-header" title="Click to view issues for version">
<strong><a class="versionBanner-name" title="Browse Version" href="http://jira.springframework.org/browse/ROO/fixforversion/11438">1.1.0.M2</a></strong>
                                        <span class="versionBanner-description">1.1.0 Milestone 2</span>
                                        <br><span class="versionBanner-releaseDate">Release Date:<span class="date">            <span style="color: #ff0000;"><strong><span title="Release Date">30/Jun/10</span></strong></span>
    </span></span>
                                                                       
                                                    <a id="release-notes-11438" class="subText" title="View release notes" href="http://jira.springframework.org/secure/ReleaseNote.jspa?projectId=10340&amp;version=11438">Release Notes</a>
                                                                       
    </div>
</li>
<li id="version-11486" class="  expando">
<div class="versionBanner-header" title="Click to view issues for version">
<div class="versionProgress" title="0 of 0 issues have been
resolved">
                                               
<table style="height: 14px;" border="0" cellspacing="0" cellpadding="0" width="200" align="right"><tbody><tr height="6">
<td width="80" align="right" valign="middle"><span class="subText"> </span></td>
<td width="100"><span style="font-size: xx-small;"> </span></td>
</tr></tbody></table>
</div>
<strong><a class="versionBanner-name" title="Browse Version" href="http://jira.springframework.org/browse/ROO/fixforversion/11486">1.1.0.RC1</a></strong>
                                        <span class="versionBanner-description">1.1.0 Release Candidate 1</span>
                                        <br><span class="versionBanner-releaseDate">Release Date:<span class="date">            <strong><span style="color: #ff0000;"><span title="Release Date">30/Jul/10</span></span></strong>
    </span></span>
                                                                       
                                                    <a id="release-notes-11486" class="subText" title="View release notes" href="http://jira.springframework.org/secure/ReleaseNote.jspa?projectId=10340&amp;version=11486">Release Notes</a>
                                                                       
    </div>
</li>
<li id="version-11498" class="  expando">
<div class="versionBanner-header" title="Click to view issues for version">
<div class="versionProgress" title="0 of 0 issues have been
resolved">
                                               
<table style="height: 6px;" border="0" cellspacing="0" cellpadding="0" width="200" align="right"><tbody><tr height="6">
<td width="80" align="right" valign="middle"><span class="subText"> </span></td>
<td width="100"><span style="font-size: xx-small;"> </span></td>
</tr></tbody></table>
</div>
<strong><a class="versionBanner-name" title="Browse Version" href="http://jira.springframework.org/browse/ROO/fixforversion/11498">1.1.0.RC2</a></strong>
                                        <span class="versionBanner-description">1.1.0 Release Candidate 2</span>
                                        <br><span class="versionBanner-releaseDate">Release Date:<span class="date">            <span style="color: #ff0000;"><strong><span title="Release Date">31/Aug/10</span></strong></span>
    </span></span>
                                                                       
                                                    <a id="release-notes-11498" class="subText" title="View release notes" href="http://jira.springframework.org/secure/ReleaseNote.jspa?projectId=10340&amp;version=11498">Release Notes</a>
                                                                       
    </div>
</li>
</ul>
6 楼 hantsy 2010-05-20  
<p>在 1. 0 发布之前,了解了一下。。。参见我的博文</p>
<p> </p>
<table style="border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0" width="510"><tbody>
<tr height="18">
<td width="25" align="right">·</td>
<td width="350">
<a class="list1" href="http://blog.chinaunix.net/u/1096/showart_1946865.html" target="_blank"><span style="font-size: 10pt; color: #02368d;"><strong>Spring Roo 再一次亲密接触</strong></span></a>
</td>
<td style="color: #aaaaaa;" width="165">2009-05-28</td>
</tr>
<tr>
<td colspan="3" align="center"><img src="http://blog.chinaunix.net/templates/default/images/right_line.gif" border="0" alt="" width="502" height="9"></td>
</tr>
<tr height="18">
<td width="25" align="right">·</td>
<td width="350">
<a class="list1" href="http://blog.chinaunix.net/u/1096/showart_1918409.html" target="_blank"><span style="font-size: 10pt; color: #02368d;"><strong>Spring Roo 第一次亲密接触</strong></span></a>
</td>
</tr>
</tbody></table>
<p> </p>
<p> </p>
<p>现在 1.1 又加入了不少新特性,特别是支持 GAE和GWT,现在准备写一些补充的文章。</p>
5 楼 yjcoffee 2010-03-26  
ThinkingInAll 写道
seam的@In很强大,可以领域模型设计

@In跟领域模型设计没什么关系,它只是提供了DI或者IoC的一种方式,其实和JSR-250中的@Resource及Spring的@Autowire是类似的。Seams的与众不同是提供bijection即所谓的双向注入(提供@In和@Out),既可以从容器上下文中注入资源,也可以将被管理组件中的计算结果Out给特定的上下文。
4 楼 ThinkingInAll 2010-03-26  
seam的@In很强大,可以领域模型设计
3 楼 yjcoffee 2010-03-26  
SSailYang 写道
引入 AspectJ 应该还是会带来一些问题,至少 IDE 是一个方面。感觉只是把一些不太重要的代码从 Java 放进了 AspectJ 里面。

是的,如果在IDE中引入AspectJ而没有相应的插件,如Eclipse的AJDT的话,编译起来肯定会报错,比如说织入的getter/setter等方法没有找到。但是试用了一下SpringSource Tool Suite(包含了原来的Spring IDE和AJDT及m2eclipse),感觉还是非常智能的。比如你删除了一个field,IDE会自动删除织入的setter/getter。

引入AspectJ虽然有一些不方便,但是编译时织入比运行时织入性能无疑要好很多。这与同样是静态语言的C#的partial特性实际上是相似的,只是C# 2.0以后的版本提供了这种特性,而Java语言上没有提供,只有通过AspectJ这样的工具增强了(而AspectJ功能更强,除了提供方法引入还提供拦截/切入等AOP特性)
2 楼 SSailYang 2010-03-25  
引入 AspectJ 应该还是会带来一些问题,至少 IDE 是一个方面。感觉只是把一些不太重要的代码从 Java 放进了 AspectJ 里面。
1 楼 yishh 2010-03-25  
和grails是不是有点重合了,难道spring收购grails之后就不管了?

相关推荐

    Spring Roo In Action

    Spring Roo是一个轻量级的Java开发工具,用于快速搭建Spring应用。它采用了一种新的方式来开发Spring应用程序,即通过命令行而非传统的集成开发环境(IDE)。Spring Roo提供了一系列命令,使得开发者可以轻松地创建...

    spring roo使用文档

    ### Spring Roo 使用文档知识点概述 #### 一、Spring Roo 简介 - **Spring Roo** 是一个基于命令行的工具,旨在简化 Spring 应用程序的开发过程。 - **功能定位**:它通过提供一系列预定义的命令来加速应用程序的...

    Spring ROO

    ROO还可以自动生成领域模型类、数据访问对象(DAO)、服务层接口和实现,甚至包括JPA实体的元数据。这极大地减少了手动编写这些基础代码的时间。 Spring ROO支持多种技术栈,如Spring MVC、Spring Web Flow、Spring...

    Spring Roo 简介,第 4 部分: 用 Spring Roo 和 Cloud Foundry 在云中快速开发应用程序

    Spring Roo 是一个基于 Java 的开源工具,它简化了 Spring 应用程序的构建过程,通过自动化任务和代码生成,让开发者能够快速地搭建起可扩展的、基于最佳实践的项目结构。 **Spring Roo 的核心特点** 1. **代码生成...

    spring roo in action

    Spring Roo是一个用于快速开发Java应用程序的框架,它结合了Spring生态系统的强大功能,尤其是对Spring MVC、Spring Security、Spring Tiles、Spring Web Flow以及Spring测试支持等方面。 Spring Roo利用了一种...

    spring roo 1.1.3 学习资料

    Spring Roo是Spring框架家族中的一个创新工具,旨在简化Java应用程序的开发过程,特别是企业级应用。它基于Spring的模块化架构,提供了一种快速开发、自动化代码生成和最佳实践集成的解决方案。Spring Roo 1.1.3是该...

    Spring Roo命令文档

    Spring Roo是Spring框架的一部分,它提供了一种快速开发工具,帮助开发者在Java应用中创建和管理代码。Roo通过自动化过程,简化了常见的开发任务,如设置项目结构、创建实体类、生成数据库表映射以及创建CRUD操作。...

    SpringRoo 官方文档-版本 2.0.0.RC1

    通过定义领域模型,SpringRoo 能够自动生成相应的数据库表结构、实体类、数据访问对象(DAO)以及相关的业务逻辑代码。以下是领域模型的一些关键要素: - **实体类**:代表应用程序中的业务对象,通常与数据库表相...

    springroo快速学习

    3. 生成代码:SpringRoo支持自动生成领域模型类、DAO、Service和Controller代码。只需指定实体类的属性,Roo会自动完成相关的数据库映射和CRUD操作代码。 4. 测试支持:SpringRoo提供测试驱动开发的支持,可以生成...

    spring roo 生成数据库表

    Spring Roo是Spring框架家族中的一个工具,用于加速Java开发,特别是企业级应用的构建。它通过命令行界面或集成开发环境(IDE)插件提供了一种快速开发的方式,可以帮助开发者生成代码、设置依赖和配置,使得开发...

    spring-roo-1.3.2.zip

    总结来说,Spring Roo 1.3.2是Spring框架下的一款强大的开发工具,旨在通过自动化和代码生成加速Java应用的开发流程,同时保持与Spring生态系统的紧密集成,让开发者能更专注于业务逻辑的实现,而非基础设施的搭建。

    spring-roo-2.0.0.RC1.zip

    Spring Roo支持多种技术,如JPA(Java Persistence API)用于对象关系映射,Hibernate作为JPA实现,以及Thymeleaf或FreeMarker用于视图层模板。 在2.0.0.RC1版本中,我们可以期待以下一些关键更新和改进: 1. **...

    spring-roo-1.1.5.RELEAS

    Spring Roo是Spring框架家族中的一个开发工具,它旨在加速Java应用程序的开发过程,特别是通过提供命令行接口和集成开发环境(IDE)插件来简化常见的编程任务。标题"spring-roo-1.1.5.RELEASE"指的是Spring Roo的一...

    spring-roo-docs

    - **标准Java实践:** SpringRoo遵循Java的最佳实践,这意味着生成的应用程序符合行业标准。 - **易于学习和使用:** SpringRoo的设计考虑了易用性,即使是初学者也能很快上手。 - **无工程妥协:** 使用SpringRoo并...

    spring-roo-1.1.0.M1.zip_54587.m1_M1 ssh_Spring Roo download_spri

    Spring Roo是Spring Framework的一个附加工具,它为Java开发者提供了一个快速开发平台,旨在简化和加速应用程序的构建过程。"spring-roo-1.1.0.M1.zip_54587.m1_M1 ssh_Spring Roo download_spri"这个标题暗示了这是...

    Spring Roo - Reference Documentation

    Spring Roo凭借其高效的开发模式、灵活的技术整合以及易学易用的特点,成为了现代Java开发领域的一股强劲力量。随着技术的不断演进,Spring Roo也在持续迭代更新,以适应更多元化和复杂的开发需求。对于追求高效开发...

    os-springroo2-sample_code

    【os-springroo2-sample_code】项目是...总的来说,【os-springroo2-sample_code】项目是一个宝贵的教育资源,适合想要深入了解和使用Spring Roo 2的开发者,他们可以通过此项目快速掌握基于Spring Roo的Java应用开发。

    vaadin-springRoo可运行的例子

    Vaadin和Spring Roo是两个强大的Java开发框架,它们在创建高效、用户友好的Web应用程序方面发挥着重要作用。这个"vaadin-springRoo可运行的例子"是一个整合了这两个框架的实际项目,提供了完整的war包和源代码,使得...

    Spring Roo 简介

    为了实现这一目标,Roo 采用了一系列流行、可靠和成熟的库,包括但不限于 Spring 框架、Java 持久化 API、JavaServer Pages (JSP)、Spring Security、Spring Web Flow、Log4J 和 Maven。 #### 二、Spring Roo 的...

Global site tag (gtag.js) - Google Analytics