原文地址:需要翻墙

https://translate.google.com/translate?hl=zh-CN&sl=zh-CN&tl=zh-CN&u=http%3A%2F%2Fdocs.spring.io%2Fspring-framework%2Fdocs%2Fcurrent%2Fspring-framework-reference%2Fhtml%2Fejb.html&sandbox=1

22.1 介绍

作为一个轻量级容器,Spring被认为是EJB的替代品。我们确实相信,如果没有太多的应用和使用情况下,Spring作为一个容器,结合其在事物,ORM和数据访问方面丰富的支持功能,这比使用EJB和EJB容器完成同等功能上是一个更好的选择。

然而,重要的一点是使用Spring就不是不使用EJB了。实际上,Spring使得访问EJBs和实现EJBs和内部功能上更加容易。另外,使用Spring访问由EJBs提供的业务允许那些业务的实现类之后轻松地在本地EJB,远程EJB,或者POJO变量之间转换,而不需要改变客户端的代码。

在这一章中,将看到Spring如何帮助你访问和实现EJBs。Spring提供了专门的value来访问无状态的会话beans(SLSBs)。

22.2 访问EJBs

22.2.1 概念

为调用本地或远程无状态会话bean的方法,客户端代码必须一般地执行一个JNDI查找来获取本地或远程的EJB的主项目,稍后在那个对象上调用create方法来获取真正的远程或本地的EJB对象。这里EJB会调用一个或更多的方法。

为避免重复的低级代码,许多EJB应用程序采用service Locator(服务定位器)和业务委托模式。这些都比通过客户端代码执行JNDI查询好得多,但是了它们一般的实现还有明显的缺陷。例如:

  • 一般地使用EJBs依赖服务定位或业务委托单例,使得很难测试。
  • 在使用服务定位而不使用业务委托的情况下,应用程序代码仍旧以调用EJB的create()方法结束并处理导致的异常。它仍旧保留了与EJB API耦合并且保留了复杂的EJB 编程模式
  • 实现业务委托模式一般地导致了明显的代码重复,这里我们得写许多方法,这些仅仅调用EJB相同的一个方法。

Spring的方式是允许代理对象的创建和使用,一般在Spring容器的内部配置,可以是无代码的业务委托。你不需要写另一个服务定位器,另一个JNDI查找,或者一个手编程序的业务委托的重复方法,除非你在这样的代码中确实需要添加实际的值。

22.2.2 访问本地SLSBs

假设我们有一个web控制器,其需要使用一个本地的EJB。我们将按照最好的实践并使用EJB业务方法接口模式,这样EJB的本地接口继承了一个非EJB-指定的业务方法接口。称这个业务方法接口为MyComponent。

<span style="font-size:14px;">public interface MyComponent {
...
} </span>

使用业务方法接口模式的主要原因之一是确保本地接口和bean实现类之间的异步是原子的。另一个原因是稍后使得我们转换成业务的一个POJO实现更加容器,如果应用程序对此很关注的话。当然了我们也需要实现本地home接口并且提供一个实现类实现SessionBean和MyComponent业务方法接口。现在我们需要做的Java编码工作(将web层控制器连接到EJB的实现类)是暴露控制器MyComponent类型的一个setter方法。这样将节省一个引用,其在控制器内作为一个实例变量。

<span style="font-size:14px;">    private MyComponent myComponent;  

    public void setMyComponent(MyComponent myComponent) {
this.myComponent = myComponent;
} </span>

我们可以随后在这个控制器的任何业务方法中使用这个实例变量。现在假设我们从一个Spring容器的外部获取了我们的控制器对象,在同一上下文中,我们可以配置一个LocalStatelessSessionProxyFactoryBean实例,这是一个EJB代理对象。这个代理的配置,和这个控制器的myComponent属性的设置,在一个配置条目中处理。

<span style="font-size:14px;">    <bean id="myComponent"
class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean">
<property name="jndiName" value="ejb/myBean"/>
<property name="businessInterface" value="com.mycom.MyComponent"/>
</bean> <bean id="myController" class="com.mycom.myController">
<property name="myComponent" ref="myComponent"/>
</bean> </span>

借助Spring AOP框架,这个场景幕后有许多事情发生,虽然你可以不强制使用AOP概念来享受你要的结果。myComponent bean定义创建了EJB的代理,其实现了业务方法接口。EJB本地home在启动的时候缓存,所以仅有单一的JNDI查询。每次调用EJB时,代理调用本地EJB的classname方法并调用EJB对应的业务方法。

myController bean定义为EJB代理设置了控制器类myComponent属性。

另外,如果有很多这样代理定义的情况下,考虑在Spring的"jee"命名空间内使用
<jee:local-slsb>配置元素。

<span style="font-size:14px;">    <jee:local-slsb id="myComponent" jndi-name="ejb/myBean"
business-interface="com.mycom.MyComponent"/> <bean id="myController" class="com.mycom.myController">
<property name="myComponent" ref="myComponent"/>
</bean> </span>

EJB访问机制简化了应用程序代码:web层代码(其他EJB客户端)不依赖EJB的使用。如果我们想使用一个POJO,或者一个虚拟对象或者其他的测试存根代替这个EJB引用,我们只需要简单地改变myComponent bean定义,而不需要改变一行Java 代码。此外,我们不必去写一个单行的JNDI查询或者其他的EJB垂直代码,来作为我们应用程序的部分。

在真实应用程序中的基准测试程序和经验指明这种方式的执行开销(涉及到目标EJB的反射调用)是最低的,并在一般使用中是无法察觉的。记住,我们不想做任何对于EJBs的细粒度调用,因为在应用程序服务器关联EJB底层中会增加开销。

在JNDI查询中有一个警告,在一个bean容器中,这个类一般以单例使用(这里没有理由设置为prototype)。然而,如果那个bean预先实例化为单例(犹如做不同的XMLApplicationContext 变量),如果bean容器在EJB容器加载目标EJB之前,你可能会遇到问题。这是因为JNDI查询将在这个类的init()方法中执行并在之后缓存,但是了EJB还没有绑定到目标位置上。虽然这个解决方案没有预先实例化这个工厂对象,但是允许在第一次使用的时候创建。在这个XML容器中,通过lazy-init属性控制。

虽然这个不是Spring使用者最感兴趣的地方,但那些使用EJBs做程序化AOP编程可能想看看LocalSlsbInvokerInterceptor。

Spring之Enterprise JavaBeans (EJB) integration的更多相关文章

  1. JavaBean的任务就是: “Write once, run anywhere, reuse everywhere” Enterprise JavaBeans

    javaBean_百度百科 https://baike.baidu.com/item/javaBean/529577?fr=aladdin 区别EJB JavaBean 和 Server Bean(通 ...

  2. Java EE (2) -- Java EE 6 Enterprise JavaBeans Developer Certified Expert(1z0-895)

    Introduction to Java EE Gain an understanding of the Java Platform, Enterprise Edition (Java EE) Exa ...

  3. JavaBean ,Enterprise Bean(EJB), 三种Bean, 以及POJO

    Bean简单的理解,可以理解为组件,一组通用方法的组合: JavaBean就可以称为Java组件,是所有组件的统称,EJB称为企业级 Java组件: 三种Bean: 1). session beans ...

  4. Spring 4 官方文档学习 Spring与Java EE技术的集成

    本部分覆盖了以下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Ent ...

  5. Spring 5 (0) - Introduction & Index

    Spring Framework Reference Documentation I. Overview of Spring Framework . Getting Started with Spri ...

  6. Spring框架文档与API(4.3.6版本)

    http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ Table of Contents I ...

  7. JDO持久 (jdbc ejb)

    转自:http://blog.csdn.net/liuzhigang1237/article/details/6305113 JDO快速入门 Java数据对象(Java Data Objects,JD ...

  8. Java 学习资料整理

    Java 学习资料整理 Java 精品学习视频教程下载汇总 Java视频教程 孙鑫Java无难事 (全12CD) Java视频教程 即学即会java 上海交大 Java初级编程基础 共25讲下载 av ...

  9. 【Java】-NO.20.Exam.1.Java.1.001- 【1z0-807】- OCEA

    1.0.0 Summary Tittle:[Java]-NO.20.Exam.1.Java.1.001-[1z0-807] Style:EBook Series:Java Since:2017-10- ...

随机推荐

  1. Struts2--拦截器Interceptor

    拦截器是的我们可以在方法的执行前后定义执行的操作.可以作为一个非常有力的工具在数据验证,属性设置,安全,日志等等方面. 拦截器可以链接起来形成一个拦截器栈.框架会按照拦截器定义的顺序依次调用这些拦截器 ...

  2. 《C++ Primer》学习笔记:向vector对象添加元素蕴含的编程假定

    练习<C++ Primer>中的3.14节时,当敲入: #include <iostream> #include <string> using namespace ...

  3. [HNOI2014]画框

    题目描述 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和. 对于第 幅画与第 个画框的配对,小T都给出了这个配 ...

  4. bzoj5055 膜法师

    Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...

  5. NOIP2014-3-15模拟赛

    Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...

  6. bzoj1926[Sdoi2010]粟粟的书架 二分 主席树

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MBSubmit: 1064  Solved: 421[Submit][Stat ...

  7. 习题7-1 uva 208(剪枝)

    题意:按最小字典序输出a到b 的所有路径. 思路:先处理出个点到目标点b的情况(是否能到达),搜索即可. 最开始我只判了a能否到b,然后给我的是WA,然后看了半天感觉思路没什么问题,然后把所有点都处理 ...

  8. C++值传递与引用传递

    值传递:形参是对实参的拷贝,改变形参的值不会改变外部实参的值,从被调用的角度来说,值传递时单向传递(实参->形参),参数的值只能传入,不能传出. 当函数内部需要修改参数,并且不希望这个改变影响调 ...

  9. C++框架_之Qt的信号和槽的详解

    C++_之Qt的信号和槽的详解 1.概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal ...

  10. python 的字符串驻留机制

    我们都知道python中的引用计数机制,相同对象的引用其实都是指向内存中的同一个位置,这个也叫做“python的字符串驻留机制”.其他的就不多说了,自行研究. 重点!!!!!! python的引用计数 ...