Spring破坏了JEE规范吗?
<!----><!----><!----><!---->
[TTS编辑注:这是TTS论坛上的原帖。我现在把它放到TTS主页上来,就是认定这又会是一场非常有趣的口水打仗。]
原文请看:http://www.theserverside.com/news/thread.tss?thread_id=50477
正文:
首先,我不是Spring的反对者。我已经在许多项目中用到了Spring,并心悦诚服的认为它是一个伟大的框架。
我想就我实际工作中Spring+JEE的整合,来探讨一些实际中遇到的问题(或者说更具“学术”性质的问题)。当我第一次看JEE规范的时候,这些问题就开始萦绕在我脑中。虽然的让我很困惑啊,但却很有意义。我现在已经知道不可以直接往文件系统写内容了。[注:在EJB中新建,修改,删除文件系统的文件是不允许的]。但我却不知道,在EJB 3.0 Spec 21.1.2规范中指出:在EJBs中不允许使用Class.forName()或类似的方法。
规范指出:
<!---->l <!---->不允许EJB去试图建立一个classloader;
<!---->l <!---->不允许EJB去得到当前的classloader;
<!---->l <!---->不允许EJB去设置当前的classloader;
<!---->l <!---->不允许EJB去设置securitymanager(安全管理);
<!---->l <!---->不允许EJB去停止JVM;
<!---->l <!---->不允许EJB改变input,output以及errorstream(流);
这就是Spring的第一个违反JEE规范的实例:当我要得到Spring中配置的Bean时,该bean会动态的用类似于Class.forName()的方法将其实例化。在使用这个方法,那么无论是显式还是隐式的都会得到一个class loader。我认为不允许动态实例化的意义在于应用服务器是想完全掌控应用程序,从而将资源等其它方面达到最优。你们怎么想的?我确实很想听听你们的意见。难道我对规范理解错了?
第二个违反规范的例子是在J2EE应用程序中使用AbstractStatelessSessionBean时发现的。规范中说:Stateless Session Bean 不允许被继承。这点我同意,尽管看上去过于“学术”,但我坚信这么做一定有它的理由。([注]关于这一点,网友马上找到规范当场对质。实际上规范说是是:session bean可以有父类或接口…….一个sessionbean不允许将另一个session bean作为其父类……….)
我还发现根本就没要Spring+JEE组合。
因为同样我还发现,一些Spring Integration Modules在不同的应用服务器下表现的比直接使用Spring更出色。(比如说在EJB容器中加载Spring Context)。你们在用应用服务器与Spring Integration Modules整合时,有没有类似经验?你们觉得这样使用是不是就可以解决我上面我所提到的问题呢?