background image

Java 教程:J2EE 应用中常见的反模式

 J2EE 应用中有一些常见的毛病和错误的观念,按照时下流行的说法,叫反模式。稍不
注意,我们自己也会犯,所以大概整理一下,一个是备忘,也是供需要的朋友参考:
  1- 无 EJB 不叫 J2EE
  EJB 一直发展到今天的 2.1 仍然被广为诟病,它提供了很多时候我们并不需要的东
西,而且我们在很多情况下一旦选用 EJB 就没有其他的方式不去使用那些笨重的功能。但
是很多所谓范例让我们有一种错觉,好像不用 EJB 就不是 J2EE 应用。有一些折中的方案
是使用 Session Fa?ade 模式,Entity Bean 采用 BMP + 本地接口,然后提供一层无状
态的 Session Bean,采用远程和本地接口,这样的设计模式,我想,多半是出于无奈。
如今,甚至我们经常都能看到不使用 EJB 的言论,炒得很火的 Spring 则为这种完全不用
EJB 开发 J2EE 项目提供了实际的、强有力的佐证。
  2- 过度分层
  J2EE

“ ”

这个规范肤浅的来看,就是为我们定义了很多 层 ,然后还有很多分工明确的

角色 ,加上 J2EE

“ ”

的蓝本应用程序就分了很多 层 ,以至于大家都觉得 J2EE 的应用就

应该是很多层的,其实不然,需要具体情况具体分析。
  3- 频繁的往返调用
  EJB 的看似简单造成我们经常忽略可能在使用过程中出现的远程调用,比如有时候
为了更新一条记录,每个字段都是远程的去 set,大大增加了不必要的开销,于是我们
意识到在调用中使用 DTO 是一个建议遵循的方案。
  4- 过度使用有状态的 Session Bean
  一般来讲,一个 Session Bean 实例,如果它是有状态的,那么它只对某个固定的
用户服务,如果是无状态的,则可以满足不同用户的调用。这有点类似(只是有点类似)一
个类的静态方法和非静态方法的区别。我们在实际应用中,应该尽量避免使用有状态的
Session Bean,除非特别必要。我们可以把状态保留在 Session Bean 之外,如 Web 容
器的 session 对象或者我们自定义的类中,而不是完全依赖有状态的 Session Bean 去
帮我们做。
  5- 过度会话
  Web 容器的 session 对象是个好东西,用起来也很方便和直截了当,这造成了我们
很多人对它的滥用,什么东西都往里面放。这有两个突出的问题,一个是资源浪费 ;另一
个,万一 Web 服务器崩溃,那些本来需要持久化的数据就丢失了。我们需要考虑好,哪
些数据本可以用 request 的,哪些数据又是需要持久化到数据库的,等等,不能一味依
赖 session。
  6- 万能 Servlet 或者万能 JSP
  J2EE 为我们提供了 Web 层丰富的技术选择,Servlet 或者 JSP 都只是其中一种,虽
然它很强大,但是也不应该由它一个来承担所有 MVC 三个部分的功能。现实中我们的
Struts 很好的规范了这个问题:Servlet 负责调度,专门的 Action 负责处理逻辑,而
JSP 用于用户界面显示。JSP 和 Servlet 本质上是同一个东西,只是从不同的角度来处理
问题,它们各有所长,互为补充。