标题：SCBCD
考试目标
﻿EJB 3.0概述*了解Enterprise JavaBeans技术EJB规范3.0版的使用、优点和特点。
*了解所有EJB 3.0容器必须为开发人员提供的API。
*区分正确和错误的语句或EJB开发语句限定样例。
*将七种EJB角色对应到角色责任的相应描述。
*描述企业Bean的打包和部署要求。
*描述标注和部署描述符的作用及使用，包括两种机制如何交互、如何处理重载以及这些机制在类、方法和字段级别上的功能。一般EJB 3.0企业Bean知识﻿*识别与所有3.0企业Bean实例生命周期有关的正确或错误语句或示例，包括@PostConstruct和@PreDestroy回调方法的使用。
*识别与拦截器有关的正确和错误语句或示例，包括实现拦截器类、拦截器实例的生命周期、@AroundInvoke方法、调用顺序、异常处理、生命周期回调方法、默认和方法级拦截器以及在部署描述符中指定拦截器。
*识别有关企业Bean如何使用JNDI或依赖性注入来声明对外部资源依赖性的正确或错误语句或示例，包括使用JNDI的一般规则、标注和/或部署描述符、EJB引用、连接工厂、资源环境条目和持久上下文及持久单元引用。
*识别与定时器服务相关的正确和错误语句或示例，包括Bean提供者的视图和责任、TimerService、定时器和TimerHandle接口，以及@Timeout回调方法。
*识别与容器提供给3.0会话Bean和3.0消息驱动Bean的EJB上下文对象有关的正确和错误语句或示例，包括安全性、事务、定时器和上下文可以提供的查找服务。
*识别与EJB 3.0 / EJB 2.x互操作性有关的正确和错误语句或示例，包括如何调整EJB 3.0 Bean以便与那些为EJB2.x API编写的客户端结合使用，以及如何从为EJB 3.0 API编写的Bean访问为EJB 2.x API编写的Bean。EJB 3.0会话Bean组件约定和生命周期*识别用于比较有状态和无状态会话Bean的作用及使用的正确和错误语句或示例。
*识别与会话Bean的远程和本地业务接口有关的正确和错误语句或示例。
*编写有状态和无状态会话Bean的类代码。
*识别与有状态会话Bean生命周期有关的正确和错误语句或示例，包括@PrePassivate和@PostActivate生命周期回调方法以及@Remove方法。
*给定一个有状态或无状态会话Bean类的方法列表，确定下列每种方法可以执行哪些操作：SessionContext接口方法、UserTransaction方法、访问java:comp/env环境命名上下文、资源管理访问和其它企业Bean访问。
*识别有关将会话Bean实施成为Web服务端点的正确和错误语句或示例，包括编写Web服务端点接口的规则以及@WebService及@WebMethod标注的使用。
*识别与会话Bean的客户端视图有关的正确和错误语句或示例，包括会话对象生命周期的客户端视图、获得及使用会话对象以及会话对象标识。EJB 3.0消息驱动Bean组件约定*开发用于实现消息驱动Bean类的代码。
*识别与JMS消息驱动Bean必须实现的接口和方法以及所需元数据有关的正确和错误语句或示例。
*描述JMS消息驱动Bean的使用和行为，包括并发消息处理、消息重新交付和消息确认。
*识别与消息驱动Bean的客户端视图有关的正确和错误语句或示例。
事务
概述事务性系统确保一个工作单元要么全部完成，要么全部回滚。EJB 体系结构支持分布式事务，但不支持嵌套事务。在嵌套事务中，当一个事务目前处于活动状态的时候，仍然可以启动新的事务。
在 EJB 开发中，Bean Provider 可以选择使用企业 bean 代码中的程序式事务划分（BMT 划分），或者由 EJB 容器自动执行的声明性事务划分（CMT 划分）。
会话 bean 或者 MDB 可以使用 BMT 或者 CMT，但不能同时使用它们。实体 bean 只能使用 CMT。容器管理的事务对于 CMT bean，EJB 容器负责管理事务边界，当用户在企业 bean 上调用某一方法，新的方法可以在调用者的事务中运行、启动新的事务或者在不使用事务的情况下运行。这种情况下，EJB 容器采取的动作由方法定义的事务属性决定。事务属性基础无论是实体 bean 还是会话 bean，业务方法中都必须给出事务属性。但是不能对会话 bean 的 home 接口方法规定事务属性，因为这些方法被认为不属于客户机事务。但是这一规则不适用于实体 bean，因为它们的 home 接口方法（如 create()和 remove()）都涉及到数据库操作，因而都是事务性的。对于 MDB，只能对 bean 的 onMessage()方法规定事务属性，因为没有客户机视图。
6 种可能的事务属性是：Required、RequiresNew、NotSupported、Supports、Mandatory和 Never。我们来看看这些属性对方法的事务性行为的影响：
Required: 如果 EJB 客户机没有关联的事务，那么容器会自动为该 bean 方法开始一个新的事务，否则使用已有的客户机事务。
RequiresNew：容器总是在调用 bean 方法之前创建新的事务。
NotSupported：调用客户机的事务性上下文不能推广到企业 bean。相反，客户机事务被挂起，bean 方法将在未定义的事务上下文中运行。
Supports：如果客户机与一个事务上下文关联，那么 bean 是在同一个事务上下文中运行，否则 bean 方法将在未指定的事务上下文中运行。
Mandatory：如果调用 bean 方法的远程客户机没有有意义的事务上下文，容器抛出 TransactionRequiredException异常。如果调用 bean 方法的本地客户机没有有意义的事务上下文，容器抛出 TransactionRequiredLocalException异常。否则在客户机的事务上下文中运行。
Never：如果调用 bean 方法的远程客户机拥有有意义的事务上下文，那么容器将抛出 java.rmi.RemoteException异常。如果调用 bean 方法的本地客户机拥有有意义的事务上下文，那么容器将抛出 javax.ejb.EJBException异常。否则，bean 方法在未指定的事务上下文中运行。事务属性的限制对于 MDB，只能使用 Required和 NotSupported事务属性，因为它们没有调用客户机，所以不能应用其他属性。
如果企业 bean 实现了 SessionSynchronization接口，只允许使用 Required、RequiresNew或 Mandatory事务属性，以确保该方法参与到事务中。对于使用 EJB 2.0 CMP 的可移植实体 bean，同样必须使用 Required、 RequiresNew或者 Mandatory事务属性。
CMT bean 可以对 EJBContext使用 setRollbackOnly()方法标记事务回滚，使用 getRollbackOnly()方法测试是否将事务标记为回滚。为了确保这些操作正常工作，调用它们的方法应该是事务性的，因此必须是 Required、RequiresNew或者 Mandatory。角色和职责Bean Provider 必须使用 <transaction-type>元素声明 bean 是使用 CMT 划分，还是使用 BMT 划分。Application Assembler 使用 <container-transaction>元素定义事务属性。Deployer 负责确保为 CMT 划分的企业 bean 方法分配事务属性。
在下面的例子中，CustomerEJB所有的方法都被赋予 Required的事务属性，只有 addBonus()方法的事务属性是 Mandatory：
<enterprise-beans> <session> <ejb-name>CustomerEJB</ejb-name> ... <transaction-type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>CustomerEJB</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> <container-transaction> <method> <ejb-name>CustomerEJB</ejb-name> <method-name>addBonus</method-name> </method> <trans-attribute>Mandatory</trans-attribute> </container-transaction> </assembly-descriptor> MDB 不能抛出应用程序异常，因为它没有客户机视图而且是异步运行的。
如果方法被重载，可以使用 <method-params>和 <method-param>元素确定适当的方法。
比如，如果希望为 addBonus(int)方法规定不同的事务属性，可以像下面这样指定该方法元素：
<method> <ejb-name>CustomerEJB</ejb-name> <method-name>addBonus</method-name> <method-params> <method-param> int </method-param> </method-params> </method>