原文地址:需要翻墙

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. Windows 2012服务器安装GPU版TensorFlow完全攻略

    一.首先,推荐用Anaconda安装 因为Anaconda本身就已经默认安装了很多常用的Python库,可以省去大量的库安装过程,并且解决兼容性问题. Anaconda本身的安装也非常简单,搜索Ana ...

  2. [Awson原创]洪水(flood)

    Description Awson是某国际学校信竞组的一只菜鸡.今年,该市发生了千年难遇的洪水.被监禁在学校的Awson不甘怠堕,想将自己投入到公益服务事业中去.这天,他偷了H老师的小电驴,偷偷地溜出 ...

  3. [SDOI2005]反素数

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  4. [BZOJ]4650: [Noi2016]优秀的拆分

    Time Limit: 30 Sec  Memory Limit: 512 MB Description 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串, ...

  5. [3.24校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...

  6. APIO2017 懵逼记

    Day -1: 移步http://www.cnblogs.com/juruolty/p/6854795.html Day 0: CTSC铁牌后,下一个就是APIO了. lmy,sxy,cxc,lh过来 ...

  7. Python中list的功能介绍

    List的功能介绍 1. 列表的两种方法 1. 列表的内置方法 列表的相加 格式:x.__add__(y)等同于x+y 例如:list1 = [1,2,3] print(list1.__add__([ ...

  8. face-alignment:用 pytorch 实现的 2D 和 3D 人脸对齐库

    使用世界上最准确的面对齐网络从 Python 检测面部地标,能够在2D和3D坐标中检测点. 项目地址:https://github.com/1adrianb/face-alignment 作者: 阿德 ...

  9. sssp-springmvc+spring+spring-data-jpa增删改查

    环境:IDE:eclipse.jdk1.7.mysql5.7.maven 项目结构图 上面目录结构你可以自己创建 搭建框架 首先加入maven依赖包以及相关插件 <dependencies> ...

  10. PLSQL(1)

      PLSQLl编程                       plsql是Oracle在标准的sql语言上的扩展 特点:可以在数据库中定义变量,常量,还可以使用条件语句和判断语句以及异常等   P ...