日期:2014-05-16 浏览次数:20593 次
要调用一个本地或者远程无状态session bean上的方法,客户端代码必须进行JNDI查找,以获取(本地或远程的)EJB Home对象,然后调用该对象的"create"方法,才能得到实际的(本地或远程的)EJB对象。然后才能调用一个或者多个EJB组件的方法。 为了避免重复的底层代码,很多EJB应用使用了服务定位器(Service Locator)和业务委托(Bussiness Delegate)模式,这样比在客户端代码中到处都进行JNDI查找要好些,不过它们的常见实现都有严重的缺陷。例如: 通常如果代码通过服务定位器或业务代理单件来使用EJB,则很难对其进行测试。 如果只使用了服务定位器模式而不使用业务委托模式,应用程序代码仍然需要调用EJB Home组件的create方法,并且要处理由此产生的异常。这样代码依然存在和EJB API的耦合并感染了EJB编程模型的复杂性。 实现业务委托模式通常会导致大量的重复代码,因为对于EJB组件的同一个方法,我们不得不编写很多方法去调用它。 Spring的解决方式是允许用户创建并使用代码量很少的业务委托代理对象,通常在Spring的容器里配置。而不再需要编写额外的服务定位器或JNDI查找的代码,以及编码的业务委托对象里面的冗余方法,除非它们可以带来实质性的好处。 ? 在一个企业级应用系统中,业务逻辑通常会被封装成EJB,开发者需要通过JNDI来访问EJB中的业务逻辑;异步的消息传递通常会使用JMS服务器,开发者需要通过调用服务器支持的队列或者主题来完成消息发送和接收;更多的情况下,开发者需要通过JDBC来访问企业数据库,完成相关数据的持久化工作,下面我们简单的看看访问这些资源所需要编写的代码片断。 ? 访问一个EJB需要完成的代码 ?//初始化EJB访问上下文 Context context = new InitialContext(); //查找jndiName对应的EJB调用入口 Object o = ctx.lookup(“jndiName”); //生成EJB访问的home接口 ?XXXHome home = (XXXHome) javax.rmi.PortableRemoteObject .narrow(o,XXXHome.class); ?//创建EJB对象 XXX xxx = home.create(); ?//完成相关业务方法调用 ?… ?//EJB使用完毕,清除EJB对象 xxx.remove();