一、POJO、EJB和事务
企业Java Bean(EJB)是一种可移植的Java EE组件,通常用于在企业应用程序中封装业务逻辑。它运行在应用程序服务器上,可以被远程客户端以及在同一个JVM进程中本地运行的其他Java EE组件使用。
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
EJB为企业应用程序提供了多线程,并发性,事务和安全性,而不需要开发人员明确地为这些功能编写代码。此外,开发人员可以声明性地向EJB添加注释,以将业务方法公开为Web服务端点。
有两种不同类型的EJB:会话Bean和消息驱动Bean(MDB)。会话bean可以有三种类型:无状态会话Bean(SLSB)、有状态会话Bean(SFSB)和Singleton会话Bean。
消息驱动Bean(MDB)使Java EE应用程序异步处理消息。 MDB侦听JMS消息。对于收到的每条消息,它都会执行一个操作。 MDB为应用程序开发提供事件驱动的松散耦合模型。
如果EJB客户端和EJB在同一个JVM进程中本地运行,则客户端可以使用@EJB注释直接向EJB引入注入。如果客户端是远程的,则使用JNDI查找。
应用程序中的EJB组件在应用程序服务器内的容器上下文中运行。容器负责管理EJB的生命周期(创建,执行和销毁)。每种不同类型的EJB(无状态,有状态,单例,MDB)都有其自己的生命周期。
Java EE支持Transactions,通过控制对数据的并发访问来确保数据完整性,并确保失败的业务事务不会使系统处于不一致或无效状态。
在Java EE中,可以通过两种不同的方式管理事务:容器管理事务(CMT)和Bean管理事务(BMT)。
在CMT中,应用程序服务器在没有开发人员编写任何显式代码的情况下管理事务,并且可以使用事务属性来控制范围。应用程序服务器在遇到故障或异常时可以自动执行回滚。
在BMT中,开发者负责管理交易并完全控制交易范围。如果发生异常或失败,开发人员必须手动提交和回滚事务。
二、实验展现:POJI到EJB的转换
通过JBDS导入一个已经存在的maven项目:
查看源码:Item.java类。这个类在应用程序中建模一个todo项目。它有三个属性:一个id,一个描述和一个表示任务是否完成的布尔属性。
如下图箭头所示:
查看:ItemRepository.java
该类模拟内存数据库并存储待办事项列表。它具有添加项目,查看单个项目和查看所有项目列表的方法。 注意到这个类用@ApplicationScoped注解,这意味着只要应用程序在应用程序服务器上部署并运行,该类的对象就保持在作用域(活动)中。
注意到seedTodoList()方法已用@PostConstruct注解。一旦该类被初始化,这个方法用三个项目填充待办事项列表。
ItemService.java类,它是一个简单的POJO类,它包含添加待办事项的方法,查看待办事项和列出所有待办事项。
注意到这个类注入ItemRepository类并调用它的方法来添加,查看和列出所有todo项目。
接下来,我们把POJO转化为无状态的 EJB.
使用@Stateless注释标注ItemService类以将此POJO转换为EJB。
查看ItemResourceRESTService类,它为前端用户界面提供了REST端点(基于AngularJS)。该文件位于rest文件夹中。
注意到这个类需要使用ItemService EJB来调用EJB的方法,并向前端层提供JSON响应。
将ItemService EJB注入到ItemResourceRESTService类中。
将@EJB注释添加到ItemService声明中。
接下来,启动EAP:
通过运行以下命令来构建和部署EJB到JBoss EAP:
查看EAP日志:
访问应用:
我们添加条目,然后观察日志:
查坎EAP日志:
整体调用逻辑:
魏新宇