对于应用程序在一台服务器上运行而数据库在另一台服务器上运行的用例,EJB 和 Spring 之间的选择无关紧要。每个平台都支持这一点,无论是 Java SE 应用程序、简单的 Servlet 容器(如 Tomcat 或 Jetty、PHP、Ruby on Rails 或其他)。
您不需要任何类型的显式远程处理。您只需定义一个数据源,提供您的数据库服务器所在的 URL 即可。
也就是说,EJB 和 Spring Beans 确实使处理数据源变得更容易。它们都可以帮助您定义数据源、将其注入 bean 并管理与它们关联的事务。
在这两者中,EJB(以及一般的 Java EE)更轻量级,并且更符合约定优于配置的原则。 Spring 需要更多的冗长来获得相同的东西,并且很大程度上依赖于 XML 文件,这些文件很快就会变得非常庞大和笨拙。硬币的另一面是,春天可能不那么神奇,在把所有你想要的东西都说清楚后,你可能会感觉更有控制力。
另一个问题是 EJB 和 Spring 的开发方式。
EJB 是免费的(就像免费啤酒一样)、开源且非专有。非营利组织 (Apache)、开源公司 (Redhat/JBoss) 和深度商业闭源企业 (IBM) 正在实施 EJB。我个人会避免后者,但对每个人来说都是他自己的。
另一方面,Spring 是免费和开源的,但具有很强的专有性。只有一家公司生产 Spring,那就是 Springsource。如果你不同意罗德的观点,那你就倒霉了。这不一定是坏事,但您可能需要注意这一点。
做每一个@Annotation 总是好的?不需要配置?
这真是一场无休止的辩论。一些人认为 XML 难以维护,另一些人则认为注释会污染原本纯粹的 POJO 模型。
我认为将 bean 注释为 EJB 无状态 bean (@Stateless) 或 JPA 实体 (@Entity) 使用注释更干净。 @EJB 或 @Inject 依赖注入也是如此。另一方面,我更喜欢将 JPQL 命名查询放在 XML 文件中而不是注解中,并且表示纯配置数据(如某物的最大值)的注入也放在 XML 中。
在 Java EE 中,每个注解也可以在 XML 中指定。如果注释和 XML 等效项都存在,则 XML 会否决注释。这使得从默认情况下的注释开始非常方便,但稍后通过 XML 覆盖它以用于特定用例。
目前 Java EE 中的偏好似乎更倾向于(简单的)注解以及大量的约定而不是配置。