J2EE业务层模式--服务器定位器
问题:
考虑要以一种统一的、透明的方式定位业务组件和业务服务。
J2EE应用系统的客户端需要定位、访问业务层的组件和服务。比如,如果表现层的一个业务代表需要访问业务层的一个会话门面,这个业务代表就首先要执行对这个会话门面的EJBHome的寻址,然后调用home的create方法,或者一个会话门面实例。于此类似,当一个JMS客户端要获得一个JMS Connection连接或者jms Session连接的时候,他首先也要执行JMS对象的寻址,然后再通过这个工厂获得Connection或者session对象。
在J2EE应用系统中,业务层组件比如EJB组件和集成层组件比如JDBC数据源和JMS组件通常都要在一个中央注册表中注册。客户端使用JNDI:JAVA命名和目录接口API来与这个注册表交互,获得一个InitialContext(初始化上下文)对象,该对象中装载着组件的名称/对象绑定信息。而为客户端的实现寻址机制的时候,也要对付好几个问题,分别跟复杂性、代码重复、性能恶化和厂商依赖性有关。
使用JNDI API和InitialContext(初始化上下文)可能相当的复杂,因为这可能要包括重复使用InitialContext对象、寻址操作、强制类型转化操作以及对底层异常和超时的处理操作。应用系统客户端需要从这种负责性中隔离出来。不然,在多种不同的客户端中就会重复JNDI代码,因为所有访问一个有jndi管理的服务/组件的客户端都要执行同样的寻址。创建一个JNDI InitialContext对象、执行EJB home对象的寻址可能是一种代价很高的操作,如果反复执行这样的操作,可能会引起系统的性能恶化。
另一个问题是:InitialContext和JNDI注册表中注册的其他Context工厂都是厂商提供的实现,如果应用系统客户端直接访问以上对象的这些特殊实现,那么就会给应用系统引入厂商的依赖性,是代码难以移植。