📄 16. ejb note.txt
字号:
EJB 3.0
Sun App/JBoss/Weblogic
-----------------------------------------------------------
Day1
1. What is EJB
EJB(Enterprise JavaBean)是JavaEE应用的业务层技术标准, 以这项技术开发的组件叫做EJB组件,常常简称EJB
EJB架构是一个用于开发和部署基于组件的分布式业务应用的组件架构。
采用EJB架构编写的应用是可伸缩的、事务性的、多用户安全的。
可以一次编写这些应用,然后部署到任何支持EJB规范的应用服务器平台上。
特点(和JavaBean比较):
1)提供远程访问的能力
2)可扩展、可插拔的能力
3)必须在EJB服务器上运行, 可享受服务器提供的事务、安全等服务
(Jboss, Weblogic, Websphere, Sun Application server)
名词解析:
1.分布式计算:
1)把大任务分成小块,分发给大家分别地做,再把每个人的计算结果汇总。
特点:分解工作,减轻成员的负担,成员之间做到职责分明。
2)充分利用网络上空闲的计算机的计算能力。
分布式组件:
1)分布对象技术是伴随网络而发展起来的一种面向对象的技术。
以前的计算机系统多是单机系统,多个用户是通过联机终端来访问的,没有网络的概念。
网络出现后,产生了C/S、B/S的计算服务模式。
2)分布式对象技术主要使用了面向对象技术的封装性,组件可以分布在网络的任何位置。
对外界来说,它所需关心的只是组件的界面(接口),至于内部是如何实现的则无需考虑,
远程客户通过方法调用来访问它。这是分布式对象技术和传统的面向对象技术的最大不同点。
2.组件:可独立发布的二进制单元
3.框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统;
代表:Struts,Spring,Hibernate…
4.中间件,是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源;
代表:Weblogic,WebSphere,Sun App Server…
5.容器:
EJB的家。 离开容器,EJB就失去了它的生命和意义
EJB分布式对象的基础
JRMI(Java Remote Method Invocation) (远程方法调用)
--- 使用远程消息交换协议JRMP(Java Remote Messaging Protocol) 进行通讯
CORBA对象调用
--- 使用IIOP(Internet Inter-ORB Protocal)
2. Why EJB
简化大型分布式系统的开发过程。
1)利用网络中多台计算机的计算能力,构建瘦客户端(简化分布式访问)
2)使用EJB服务器提供的系统级的企业服务(事务、安全、对象池....),开发人员需要写业务组件
3)EJB组件具有热部署的能力(可插拔)
4)可以扩展现有系统的JavaBean
优点:可维护性、重用性、可扩展性、可插拔性
1)缩短开发时间: 编程人员可将先行开发的部件装配到新的程序中,从而加速了新程序的开发
2)降低集成费用: 在将组件集成为一个完整的方案时,不同开发商采用了一致的标准接口,减少了特殊的定制工作
3)开发更具灵性: 只需简单调整全部应用的一些组件,即可为企业不同领域的应用提供特定的解决方案
4)降低维护费用: 各组件的软件功能是相对独立的,在维护和升级一个组件时,不必变动整个应用。维护简便
3. When to use EJB
少量的需要分布式技术支持的大型项目,比如:
1)应付巨大的客户访问量 2)和已有的系统做集成
EJB可以做什么?
1)服务器端的业务层框架 2)遵循EJB规范的标准组件 3)分布式组件
4)持久化数据支持 5)事务性支持 6)支持并发多用户安全
技术选择:
表现层技术:Servlet, JSP MVC框架:Struts,Tapestry,MyFaces...
业务层组件:JavaBean 集成层: Spring,EJB
持久层技术:JDBC ORM框架:Hibernate,TopLink,OpenJPA,EJB JPA...
常见技术组合:
Struts/MyFaces + EJB(JDBC)
需要分布式技术的大型项目,大并发访问量,性能要求高
Struts/MyFaces + Spring + Hibernate
多数中小型项目
EJB 3.0
1)会话Bean:对业务逻辑建模
分类: 有状态,能分辨不同的客户;无状态,不能分辨不同的客户
2)实体(Entity)
POJO
3)消息Bean
支持异步通信。没有直接的客户端,由消息触发(驱动)
4. First EJB开发步骤:
EJB组件开发:
1)安装JBoss,并启动
默认端口:8080;可以修改 %jboss_home%/server/default/deploy/jboss-web.deployer 的server.xml
把 <Service name="jboss.web"> 的 <Connector port="8080" ... 改成想要的就行
2)开发一个普通的Java组件
3)classpath加上Java EE 5 Libraries(MyEclipse自带类库)
4)加EJB的标注,声明为EJB组件
IHello.java (接口标注:@Remote )
HelloBean.java (无状态会话bean标注:@Stateless )
5)编译,在 FirstEJB/bin 运行命令: jar cvf HelloEJB.jar .
6)拷贝HelloEJB.jar到%jboss_home%/server/default/deploy目录下
这是正常发布方法。需要启动%jboss_home%/bin/run.jar (win下用run.bat,linux用run.sh启动)
7)确认组件已部署(控制台没有异常)
EJB客户端开发:
1)classpath加上jbossall-client.jar(这个包在 %jboss_home%/client/ 下)
引入这个jar包之后才可以初始化上下文(context)
2)引入IHello.class
3)Client.java
5. JNDI(Java 命名和目录服务接口)
JNDI为JavaEE平台提供了一个通过名字查找网络中一切对象的标准机制
是一套为开发者提供通过名字方便查找用户、机器、网络、对象和服务的 Java API
JNDI实现了EJB对象位置的透明性,客户端只要能访问JNDI服务,便可以调用EJB服务。
1) 部署ejb的时候,容器将会把EJB对象绑定到命名服务
2) 像JDBC可以访问不同的数据库,可以通过JNDI访问不同的JNDI服务
a.设置上下文工厂
b.设置JNDI服务提供者的url
3) JNDI的API的使用
初始化上下文(Context ctx = new InitialContext() )
--- 不同的应用服务器初始化上下文的工厂类是不同的,协议也可能不一样!!!查文档吧
三种方式初始化上下文:
a)设置系统属性(Test.java中)
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
org.jnp.interfaces.NamingContextFactory.class.getName());
上句也可以这样写: System.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
System.setProperty(Context.PROVIDER_URL, "localhost");
//"localhost" 也可以写: jnp://127.0.0.1:1099
b)通过命令行设置
c)在类路径下添加jndi.properties ---名字不能修改!!
jboss中:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
Sun App Server 9.0 中:
java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory
java.naming.provider.url=iiop://127.0.0.1:3700
4) JNDI API(javax.naming.Context接口) 主要方法的使用
void bind(String name, Object object); //将名称绑定到对象。如果已经存在,则抛出异常。
void rebind(String name, Object object); //将名称绑定到对象。如果存在,重写所有绑定。
void rename(String oldName,String newName); //把某一个已经绑定的旧名称改新名字
void unbind(String name); //取消指定对象的绑定。
Object lookup(String name); //查找指定的对象。
注意:这4个方法都 throws NamingException;
5) JBoss下配置JNDI名称
在jboss下配置bean的JNDI名可以采取三种方式:
第一种:也是默认的,"beanname/remote"
第二种:使用@RemoteBinding注释。(导入jboss-annotations-ejb3.jar)
@RemoteBinding(jndiBinding="jndiName") --- 这种方式不好,与JBoss耦合!!!
第三种:使用jboss.xml文件,此文件要放在src\META-INF目录下。具体内容见下面:
<jboss>
<enterprise-beans>
<session>
<ejb-name>BeanName</ejb-name>
<jndi-name>jnidname</jndi-name>
</session>
</enterprise-beans>
</jboss>
6. 远程调用的原理
1)使用Socket进行网络通信
2)使用代理模式,使得调用服务器端的远程对象,看起来像调用本地对象一样
3)客户端的代理叫做Stub(桩)
4)服务端的Skeleton(框架)
5)调用过程: Client -> Stub(远程接口) -> Skeleton -> EJB Object(也叫远程对象)
RMI简介
1)RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它增强了开发分布式应用的能力。
2)Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
3)RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。
4)用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment,Java运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI 对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
RMI架构
1) Stub/Skeleton层
该层提供了客户程序和服务程序彼此交互的接口。
2) 远程引用层(Remote Reference)
中间层,负责处理远程对象引用的创建和管理。
3) 传输协议(Transport Protocal)
提供了数据协议,用以通过线路传输客户程序和远程对象间的请求和应答。
编写RMI的程序
1) 定义远程接口
通过扩展 java.rmi.Remote 接口,并定义所需的业务方法实现
远程方法必须声明抛出 java.rmi.RemoteException 异常;或者这异常的父类
远程方法的参数和返回值必须是实现序列化接口的类(基本类型也可以)
2) 定义远程接口的实现类
即实现上一步所定义的接口,给出业务方法的具体实现逻辑。
3) 编写运行 Skeleton 引导程序注册RMI服务 (定义协议,并等待客户端调用)
4) 编写客户端 Stub;(遵守协议的端口、读取发送信息的方式;供调用)
使用动态类加载机制(反射机制)
5) 编写客户端Client,调用远程对象
7. Local接口和EJB组件的依赖注入
1)本地接口: @Local
2)EJB组件的依赖注入:@EJB(mappedName="EJB Name/remote")
ejb客户端开发步骤:
1)引入ejb远程接口(a方式.引入ejb工程, b.把远程接口直接Copy过来)
2)引入jbossall-client.jar
3)保证src目录下面有一个jndi.properties
4)客户代码,如:Test.java
8. Remote 和 Local
Local(默认方式) Remote
使用@Local标注 使用@Remote标注
只能本地调用,远程不行 既可以本地调用,也可以远程调用
避免网络交换过程 无法避免网络交换过程,性能差
允许传递未序列化的参数 不允许传递未序列化的参数
注意:要调用实现Local接口的sessionbean,客户端程序和EJB必须在同一JVM的服务器环境。
远程客户端也可以通过 与EJB在同一JVM的代理去访问(如Stub/Skeleton;或者用一个@Remote的Bean间接调用)
-----------------------------------------------------------
Day2
1. EJB的Web客户
在web项目中调用EJB
web项目在tomcat部署:
web项目中必须包含远程接口
web项目必须导入jbossall-client.jar
web项目在jboss部署: (在同一台服务器上部署)
web项目: 不需要 远程接口和jbossall-client.jar(注意: 一个JBoss中不能出现两个相同的类)
2. EJB编程模型
3. EJB的分类(2.X分类)
1)Session Bean(会话Bean) (Stateless和Stateful) --- 对业务逻辑建模
2)Entity Bean(实体Bean,3.0使用JPA替代) -- POJO ---对领域模型建模
3)Message Driven Bean(消息驱动Bean) --- 支持异步通讯,没有直接的客户端,由消息驱动
4.EJB的系统服务
1)事务
2)安全
3)对象池
5. 部署描述符和标注
早期版本使用配置文件开发EJB, EJB3.0使用Annotation简化开发
1)开发阶段:开发人员使用Annotation开发
2)部署阶段:部署人员使用部署描述符部署(将覆盖annotation配置)
部署描述符:
1) 标准部署描述符:ejb-jar.xml
<ejb-jar version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd ">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -