Enterprise JavaBeans(EJB)是一个开发和部署分布式服务器端的、带事务处理的、安全的商业组件的规范和结构。EJB的体系结构是J2EE的基础和核心,J2EE定义了整个标准的应用开发体系结构和一个部署环境。
在这个体系结构中,应用开发者的注重力集中在封装商业逻辑和商业规则上,一切与基础结构服务相关的问题和底层分配问题都由应用程序容器或服务器来处理。
甚至,从属于事务、持久化、安全等等方面的应用组件的运行时属性都可以使用高度灵活的声明方法在部署的环境中定制。这个体系结构定义了一个容器和一个服务器模型--容器是应用组件生存和执行的环境,而这个容器却又借居在一个服务器之中。
J2EE平台提供了一个简化的开发模型,它具有工业强度的可扩展性、支持合理的集成和灵活的部署,与开发商和应用服务器无关,这一切使得一些专用的应用服务器和专用的分布式对象框架变得古旧了。
EJB的角色和责任
EJB规范定义了几个标准的角色和责任者,如下:
1.EJB服务器提供商提供的应用服务器应是一个在分布式事务处理、系统服务等方面的专家。
2.EJB容器提供商提供EJB组件实例运行环境和部署工具。
服务器/容器提供商是典型的操作系统开发商、数据库开发商或者是应用服务器开发商。EJB的服务器和EJB的容器应是同一个开发商提供,因为无论是在现在的EJB1.1规范(最终版)还是EJB2.0公共草稿版(正在修改)中都没有定义两者之间的接口。
3.Bean的提供商或者EJB开发者开发的EJB组件都包涵商业逻辑及商业功能。EJB开发者提供的每一个EJB组件都应满足以下条件:EJB的实现中应包括所有必须有的组件-容器合同方法(Contract method),如:ejbCreate(),ejbRemove()等等和一些商业方法(business method);Home接口;Remote接口;如需要还应有帮助类。Home接口为创建、删除和查找EJB实例的方法提供签名,Remote接口定义了商业方法的签名。
4.应用程序组装器把一些由Bean提供商开发的EJB组件组装成一个完整的J2EE应用程序。
5.部署器在应用程序部署的目标产品环境中是专家,它在应用服务器中安装应用组件并配置它们的事务、持久化和安全方面。这样你就可以治理复杂的问题了,诸如:事务处理、并发处理、持久化以及安全。
6.系统治理者负责服务器的配置和治理、运行监控和负载平衡。
7.应用程序的用户界面开发者负责用户界面和表示逻辑。
这篇文章的焦点集中在Bean提供商/EJB开发者方面和EJB组件实现代码的限制方面。
EJB组件的约束
EJB的开发者并不需要在EJB的组件实现代码中编写系统级的服务,EJB提供商/开发者需知道并且严格地遵守一些限制,这些限制与开发稳定的和可移植的EJB组件的利益有关。以下是你应该回避使用的一些Java特色,并且在你的EJB组件的实现代码中要严格限制它们的使用:
1.使用static,非final 字段。建议你在EJB组件中把所有的static字段都声明为final型的。这样可以保证前后一致的运行期语义,使得EJB容器有可以在多个Java虚拟机之间分发组件实例的灵活性。
2.使用线程同步原语来同步多个组件实例的运行。避免这个问题,你就可以使EJB容器灵活的在多个Java虚拟机之间分发组件实例。
3.使用AWT函数完成键盘的输入和显示输出。约束它的原因是服务器方的商业组件意味着提供商业功能而不包括用户界面和键盘的I/O功能。 4.使用文件访问/java.io 操作。EJB商业组件意味着使用资源治理器如JDBC来存储和检索数据而不是使用文件系统API。同时,部署工具提供了在部署描述器(descriptor)中存储环境实体,以至于EJB组件可以通过环境命名上下文用一种标准的方法进行环境实体查询。所以,使用文件系统的需求基本上是被排除了。
5.监听和接收socket连接,或者用socket进行多路发送。EJB组件并不意味着提供网络socket服务器功能,但是,这个体系结构使得EJB组件可以作为socket客户或是RMI客户并且可以和容器所治理的环境外面的代码进行通讯。
6.使用映象API查询EJB组件由于安全规则所不能访问的类。这个约束加强了Java32 平台的安全性。
7.欲创建或获得一个类的加载器,设置或创建一个新的安全治理器,停止Java虚拟机,改变输入、输出和出错流。这个约束加强了安全性同时保留了EJB容器治理运行环境的能力。
8.设置socket工厂被URL's ServerSocket,Socket和Stream handler使用。避免这个特点,可以加强安全性同时保留了EJB容器治理运行环境的能力。
9.使用任何方法启动、停止和治理线程。这个约束消除了与EJB容器治理死锁、线程和并发问题的责任相冲突的可能性。
通过限制使用10-16几个特点,你的目标是堵上一个潜在的安全漏洞: 10.直接读写文件描述符。
11.为一段特定的代码获得安全策略信息。
12.加载原始的类库。
13.访问Java一般角色所不能访问的包和类。
14.在包中定义一个类。
15.访问或修改安全配置对象(策略、安全、提供者、签名者和实体)。
16.使用Java序列化特点中的细分类和对象替代。