Gavin King真正走上EJB路线,推出基于JSF/EJB3的快速开发框架JBoss Seam

JBoss Seam 1.0是试图给出一种基于JSF+EJB的快速开发框架,是和ROR和JF类似一种框架,我最为看中的是其终于意识到状态管理是框架基本重要的功能了,而这点正是Spring缺乏的:
1.A unified component model centered around EJB.
围绕EJB的组件模型。
2. Raises the semantic level of development.
提高开发阶段层次。
3. A new contextual component model / higher level state management over HTTPSession.
基于HttpSession的高层次组件架构状态管理。
4. DRW-style AJAX EJB invocation and the ability to recieve JMS messages in the browser.
DRW风格的AJAX EJB调用方式(实际EJB remote调用)
5. Support for process-driven applications.
过程驱动应用支持
6. Portal integration.
门户整合,可和JBoss Portlet整合
7. Testability.

http://www.theserverside.com/news/thread.tss?thread_id=40908

这件事情解释了三个疑惑:
1.当初作为Hibernate创始者 Gavin King进入JBoss后,表示他将自己的新鲜理念来增强EJB。

2.本人在EJB vs Spring中一直强调Spring没有Session状态管理缺陷,并且专门写文章“状态对象:数据库的替代者”http://www.jdon.com/artichect/state.htm
而JdonFramework从1.2版本后就支持基于HttpSession的状态管理。

3.Seam是使用在JSF+EJB架构下,而Struts目前应用最广,而JdonFramework可以使用在Struts+EJB获Struts+POJO架构下,有人曾经责问:已经有EJB,还需要JdonFramework做什么?这个问题同样可以问问Gavin King了,他为什么还要做基于JSF+EJB上的框架?


这件事情同时又说明另外一个问题:

有人说:Struts+Spring+Hibernate是一种非常好的架构选择,我想,Hibernate创建人Gavin King可能不同意这样的架构选择是最完美的,否则,Gavin King不会再重新发明相同轮子,再次开发Seam。

Gavin King开发Seam是目的将那些被Rubby on Rails(RoR)吸引的程序员再次吸引回来,为什么认为能够吸引回来?前提是RoR肯定又不足之处(如将业务写在MVC的COntroller中,混淆层次,这是以丧失可维护性换来的快速性)。

再向前推理,为什么那么多热衷于Spring的人突然被RoR吸引,因为RoR肯定又Spring所没有,但符合程序员要求的心理,那是什么?快速简洁,也就是说,真正使用Spring开发一个完整带权限的项目,并不真正象他宣言和Demo展示的那样简单,甚至巨复杂,看看号称经典组合的Spring + Acegi关于实现基于容器的URL访问权限和组件访问权限的配置文件,配置行如此复杂,你的将来被捆绑在Spring下一个子框架Acegi上,Spring不是号称优雅解决一切吗,为什么Acegi的权限配置如此让人看不懂?
看看那下面的配置:
http://www.jdon.com/jive/thread.jsp?forum=61&thread=25141&message=18262459#18262459

在使用Struts+Spring+Hibernate架构中,最大的缺失就是:没有状态管理支持,只依靠Hibernate那点可怜的缓存是不行的,但是直接使用EJB的有态Bean本身又有不方便之处,这也就是Seam突出状态管理特点的原因。

没有感到Session支持这种缺憾的程序员都是因为他没有状态设计概念,他实际是使用这种架构做他的围绕数据库编程的软件系统,然后自我安慰以为达到OO设计最高水平,进而狂欢Struts+Spring+Hibernate简单得不是高科技了,都是自欺欺人罢了。

没有状态管理支持的意思就是:使用数据库持久替代状态管理,不使用内存缓存支持状态管理,打个比喻,当你在编辑文档时,是不是每个敲入每个字后,都要保存一次?我想大多数人不会因为怕掉电坠入如此神经质的操作中,但是你在企业开发时,为什么每次将新的状态数据都保存到数据库中进行持久呢?

所以,我们需要基于内存(如httpSession)的状态管理,而不是基于数据库,如果不抛弃数据库概念,就不能完全坚持OO面向对象的思维,就会产生思维方式的错误,见下面案例提问:
关于要经过7,8次审核的商品发布数据库设计:
http://www.jdon.com/jive/thread.jsp?forum=46&thread=27544


也就是说:在java世界中,没有一个架构象.NET世界那样主宰世界,包打天下,完美无缺,总是各有所长,我也不相信有完美无缺的架构,如果微软硬说它的东西是,那么出问题的就是微软本身,所幸bill gates 2008年前就退出日常管理了,他的时代要画个句号了。

我的最终目的不是说:EJB就是好,如果你得出这个结论,而且你认为板桥里人我就是维护EJB的,说明你的脑子还是简单了点。

在java世界中,没有一个架构包打天下。

如果说EJB2.0忽悠了你,那么Spring是不是也在另外一处忽悠了你呢?如果说RoR好像不错,但是是不是又在某处忽悠了你?按起葫芦飘起了瓢,这在java世界反复上演。

所以,你当心EJB3和Seam再次忽悠你。

Hey Banq,

Please read the Seam Doc or implement some example by Your self . then Judge it ! otherwise You just Bushit!

to houwei
我先show给你Seam中一个忽悠之处:
在http://docs.jboss.com/seam/1.0.1.GA/reference/en/html/tutorial.htmld0e198
中Example 1.2. ,有下面一段代码:



@Stateless (1)
@Name("register")
public class RegisterAction implements Register
{

@In (2)
private User user;

@PersistenceContext (3)
private EntityManager em;

@Logger (4)
private Log log;

public String register() (5)
{
List existing = em.createQuery(
"select username from User where username=:username")
.setParameter(
"username", user.getUsername())
.getResultList();

if (existing.size()==0)
{
em.persist(user);
log.info(
"Registered new user #{user.username}"); (6)
return
"/registered.jsp"; (7)
}
else
{
FacesMessages.instance().add(
"User #{user.username} already exists"); (8)
return null;
}
}

}

这是表现层的Action/Controller,这个Action中耦合了数据库操作 以及Jsp界面输出(如return "/registered.jsp"),这不又回到两层结构吗?快速开发是靠压扁层次吗?如果是这样的创新,地球人都知道。

作为表现层的Action/Controller其实是一个Mediator模式实现,主要负责前后台交互(复杂系统中前后台交互逻辑非常复杂,Action和流程配置一起担负这项任务),前几天我们还在批判Action中不要写业务逻辑:
http://www.jdon.com/jive/article.jsp?forum=16&thread=27452

Gavin King倒好,不但在Action中写业务逻辑,数据库Dao也拉进来了,确实够快的,但是这样做但容易误导初学者了吧?

其实,jdon就挺好用的,对于普通的程序员来说

多谢Jacal支持,好但是当初没有国人识别,有一个参与"Spring开发指南"重要知名作者当初还责问我:你的框架好,为什么没有看到国外同类框架冒出来呢?

时隔一年,现在他可以看到了,JBoss Seam, Spring 2.0的new Beans Scope,以及最新的状态管理专用框架Scopes。

Scopes是一个新的Web应用scope使用框架,使用Scopes,就不必使用HttpServletRequest.getSession().getApplication().getAttribute这样的语法保存你的状态对象了。

TSS上有人又大发厥词,认为Scopes诞生是受JBoss Seam的鼓舞,其实这是程序开发应该考虑的基本事情,我的JF从诞生开始就已经整合业务层的状态支持,那时候只有Spring 1.0和RoR在大呼小叫呢。

有时不小心和国外软件走了并列第一也是有可能的,问题时很多国人熟视无睹,最终还是认为国产软件差,其实国产软件整体水平上去,不是靠一两个人,靠机制。
http://www.theserverside.com/news/thread.tss?thread_id=41119

就目前Java框架状况,小结如下:不足之处请补充:

1. EJB3 可惜只有JBoss ORacle几家支持,时隔1年多IBM和BEA巨头还未成熟服务器。所以,JBoss Seam目前还只好先于JBoss AS捆绑在一起,Seam也不是Ioc/AOP框架。

2. Spring 2.0 虽然亡羊补牢,为时未晚,可惜编译器换了,不能用Java标准编译器,那是不是在语言上走向另外一个方向?而且根据运行时动态更换软件组件设计原则,Spring 2.0将AOP weaving做成了静态,是不是设计倒退?虽然性能提升了。

3. RoR, 不是Java框架,万一系统不小心做大了,不知向何处发展?还将业务代码和MVC的Controller混淆在一起编程,减少架构层次达到快速开发的招,地球人都会,这是以丧失软件质量为代价的快速开发。

4. Scopes,独立的对象生命周期管理的框架,可以管理对象状态长短,可适用在J2EE和Swing当中,刚刚出来,状态管理是一件很复杂很灵活的事情,是否成熟有待观察。

5.JF, 国人开发的框架,因为观念问题,未获得国人广泛认同,所以,维护只能靠Jdon;进而又阻碍其广泛应用。

我关注它的Web 2.0支持、Portlet、BPM、JBI

这只不过是一个demo罢了,有什么好忽悠的,熟练JAVA的开发人员是不在乎什么框架的,而是随心所欲的使用JAVA,崇尚自由,不要被框架所框死,只要能有用就OK,我现在在简单应用中还使用servlet来控制页面跳转呢,随爱怎么所就怎么说。

> to houwei
> 我先show给你Seam中一个忽悠之处:
> 在http://docs.jboss.com/seam/1.0.1.GA/reference/en/htm
> /tutorial.htmld0e198
> 中Example 1.2. ,有下面一段代码:
>
>
>


> @Stateless
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> (1)
> @Name("register")
> public class RegisterAction implements Register
> {
>
> @In
> In
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> (2)
> private User user;
>
> @PersistenceContext
> xt
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> (3)
> private EntityManager em;
>
> @Logger
> er
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> (4)
> private Log log;
>
> public String register()
> ()
>
>
>
>
>
>
>
>
>
>
>
>
> (5)
> {
> List existing = em.createQuery(
"select username
> rname from User where username=:username
")
> .setParameter(
"username",
> ername
", user.getUsername())
> .getResultList();
>
> if (existing.size()==0)
> {
> em.persist(user);
> log.info(
"Registered new user
> new user #{user.username}
");
> (6)
> return
"/registered.jsp";
> ed.jsp
";
>
>
>
>
>
> (7)
> }
> else
> {
> FacesMessages.instance().add(
"User
> dd(
"User #{user.username} already exists");
> (8)
> return null;
> }
> }
>
> }
>
>

>
> 这是表现层的Action/Controller,这个Action中耦合了数据?> 操作 以及Jsp界面输出(如return
> "/registered.jsp"),这不又回到两层结构吗?快速开发是靠
> 贡獠愦温穑咳绻钦庋拇葱拢厍蛉硕贾馈?>
> 作为表现层的Action/Controller其实是一个Mediator模式实?> ,主要负责前后台交互(复杂系统中前后台交互逻辑非常复杂
> Action和流程配置一起担负这项任务),前几天我们还在批?> Action中不要写业务逻辑:
> http://www.jdon.com/jive/article.jsp?forum=16
> thread=27452

>
> Gavin
> King倒好,不但在Action中写业务逻辑,数据库Dao也拉进来?> ,确实够快的,但是这样做但容易误导初学者了吧?
>

其实过多的讨论好像是没有用的,JBoss的好是世界公认的,我仿佛记得还获得了一个什么奖,RedHat所以因此而收购JBoss。

JBoss Seam是很多程序员的劳动结果,就凭它是JBoss的项目,就值得我们去学习。
反观JF,说实在的,实在不敢用,因为不出名,使用的人很少,出了问题也不知道找谁。

并不是我们天生看不起国产,而是我们水平确实比不上人家,这是事实,不得不承认。
JF现在有多少人在开发和维护呢?假如是一个人单打独斗开发和维护,我真的不敢使用。
JBoss现在有很多人在开发和维护,而且JBoss有大公司支持,比如RedHat,我们信赖。
现在的开发框架满天飞,到处都是,我甚至想:哪天我自己也写一个servlet的分派器,功能尽量简单点,不也是一个框架么?


其实何必在意框架什么的。。。开发讲究的是模式思维,只要不要被框架框死了,那就OK了

Spring、hibernate其实都非常不错,起码对我们是足够用了,我自从04年以来一直使用Spring和hibernate,先后实施了3个项目,前两个比较简单,现在这个稍微大了点--有100多张表,估计能算得上中等规模的项目吧。项目开发将近一年了,大部分的问题我们都遇到过,而且都能解决,能很快解决问题原因也很简单:
1.Spring和hibernate本来就不复杂,学习成本很低。我们这边招来的刚毕业的学生学习一两个月就能进入开发,而且开发效率也不慢。
2.Spring和hibernate的帮助文档齐全,源代码可读性比较好--结构清晰,段落分明。
3.论坛帮助很多,很多人都在使用和讨论。

我最近正在研究如何把Spring和hibernate的框架迁移到基于EJB3.0的框架上,JBoss Seam我也大致看了一下,Seam可以把一个bean注入到Action层(控制层),但我对JSF不是很感兴趣,尽管SUN极力鼓吹JSF的好处,却无法打动我,因为JSF的标签库过于复杂。MVC框架的选择还是比较多的,不一定要使用JSF。

> 其实何必在意框架什么的。。。开发讲究的是模式思维,只要
> 灰豢蚣芸蛩懒耍蔷OK了