EJB3业务代表

时间:2010-03-25 18:05:24

标签: java jsf java-ee ejb-3.0

使用EJB3时是否有任何理由成为委托?因为我从委托中看到的唯一真正好处是它允许隐藏EJB体系结构的查找和访问细节。好吧它也提供了一些解耦,但它几乎未使用,imho。使用EJB3我们有注入,所以现在我可以用@EJB注释创建一个变量并按原样使用它。 我还需要代表吗?这种注射资源消耗了吗?我的意思是,如果我在JSF的请求中使用它,托管bean可能更好地使用委托只是为了减少这些注入调用?

谢谢!

3 个答案:

答案 0 :(得分:7)

让我们回顾原始business delegate pattern力量

  • 演示层客户需要访问业务服务。
  • 不同的客户端(例如设备,Web客户端和胖客户端)需要访问业务服务。
  • 业务服务API可能会随着业务需求的变化而变化。
  • 最好尽量减少表示层客户端和业务服务之间的耦合,从而隐藏服务的底层实现细节,例如查找和访问。
  • 客户可能需要实施业务服务信息的缓存机制。
  • 希望减少客户端和业务服务之间的网络流量。

所有这些力量今天仍然相关 - 它们不是每个项目都必须存在,但可以

主要的变化是我们不需要业务委托来最小化耦合(斜体的那个)。依赖注入解决了查找和访问的问题。

我喜欢analysis from Adam Bien:关于耦合的一点,仍然没有自然解决的是例外。例外情况现在未经检查,但仍然存在。客户端是否应该完全屏蔽EJB异常,这又取决于项目中存在的力量。

在引入业务委托模式以解决查找和访问问题的情况下(我怀疑是很多项目的情况),我们实际上不再需要它了。如果业务代表是出于其他原因,它仍然有意义。

PS:从我自己的经验来看,资源注入从来就不是一个性能问题(除了注入的毫秒之外,我总是遇到更严重的性能问题:)

答案 1 :(得分:1)

业务代表只是用JNDI查找和所有相关的清理和错误捕获来隐藏整个kludge。资源注入通过Gavin Kings Seam进入J2EE,它基本上遵循尽可能少的层次和一个地方的所有配置原则。所以忘记那些旧的模式,只使用普通的OO思考。

我的2美分。

答案 2 :(得分:0)

嗯,其实我不太明白这些观点。

  

表示层客户端需要访问权限   商业服务。

JSF的表示层是托管bean,不是吗?如果是这样,那么这个问题就可以通过注射解决了。正确?

  

不同的客户,例如设备,   需要Web客户端和胖客户端   获得商业服务。

我没有设备和胖客户端。什么是网络客户端?它不是来自上面的表示层吗?如果是这样,那么我们就有与上述相同的情况。

  

业务服务API可能会更改为   业务需求不断发展。

我无法理解委员会在API更改时如何提供帮助。嗯,当然,如果只是通过改变某些传递参数的类型或仅使用某些字段而不是某些参数来处理一些小的变化,那么它可以帮助,但我不认为这种情况经常发生,并且它不是那么困难,甚至可能更好地从托管bean或其他任何方式更改方法调用。虽然重大变化将要求改变方法调用。

  

客户端可能需要实现缓存   商业服务机制   信息。

缓存是一个难题,因为我不知道要缓存什么以及如何操作:)这是否意味着我可以创建一些变量来存储一些结果并仅在调用此变量时使用ejb调用第一次?像代表那样的共享资源是一种好的做法吗?

  

希望减少网络   客户与企业之间的流量   服务。

代表们如何减少网络流量?通过相同的方法与变量存储一些值?