EJB2.x和EJB3.0开发步骤的不同之处
举两个随处可见的例子说说?EJB2.x和EJB3.0开发步骤的不同之处,这两个例子只是为了清楚的说明它们开发步骤的不同之处,不保证能够运行,例子的显示输出结果在eclipse的控制台中显示。
??????? 先说说EJB3.0吧:?
??????? EJB3.0,不需要创建Home和对象接口,不需要组件接口(javax.ejb.SessionBean和javax.ejb.MessageDrivenBean),使用java元数据注释(@?? 其中“?“表示注释名),简化了EJB环境的API。
?????? EJB3.0开发步骤:?????? 1.?编写业务代码,Bean类?????? 2.?生成部署描述符?????? 3.?将2,3打包成Ejb-jar文件?????? 4.?部署Ejb-jar文件到容器,查看EJB容器看是否部署成功?????? 5.?编写执行客户应用?????? 与其相关的小例子:1.创建一个业务接口 Test.java类
package?com.ejb.interface
/**
???*?Test的业务接口
???*/
public?interface?Test?{
???????????/**
??????????????*?@return返回成功消息给用户?
??????????????*/
????????????public?String?test();
}2.创建一个无状态会话bean???? TestBean.java类
package?com.ejb.bean
import?javax.ejb.Remote;
import?javax.ejb.Stateless;
/**
???*?无状态会话Bean
???*/
@Stateless
@Remote(Test.class)
public?class?TestBean?implements?Test?{
????public?String?test()?{
????????System.out.println("test()");
????????return?"------sucess------";
????}
}3.调用test()方法??? TestClient.java
package?com.ejb.bean.client
import?javax.naming.Context;
import?javax.naming.InitialContext;
/**
?*?调用远程的无状态会话bean
?*/
?public?class?TestClient{
??????public?static?void?main(String[]?args)throws?Exception{
?????/**
?????????*?初始化上下文?jndi
?????????*/
?????Context?c?=?new?InitialContext();?????
?????Test?test?=?(Test)c.lookup("com.ejb.interface.Test");
?????/**
????????*?调用Bean实例的test()方法,并将结果在控制台输出
????????*/
?????System.out.println(test.test());
????????}
?}4.部署描述符
<?xml?version="1.0"?encoding="UTF-8"?>
<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">
</ejb-jar>?
????????? 下面看看EJB2.x的开发步骤吧,看完下面这个就会觉得EJB3.0真的简化了很多啊^_^。
1.远程接口 Test.java
package?com.ejb2.test
/**
?*TestEJB组件的远程接口,
?*/
public?interface?Test?extends?java.ejb.EJBObject{
????//用于返回成功消息的方法
????public?String?test()?throws?java.rmi.RemoteException;
}2.本地接口 TestLocal.java
/**
?*TestEJB组件的本地接口,
?*/
public?interface?TestLocal?extends?java.ejb.EJBLocalObject{
????//用于返回成功消息的方法
????public?String?test();
}3.Home接口 TestHome.java
package?com.ejb2.test
/**
?*TestEJB组件的Home接口,
?×create()()方法方法对应于TestBean中的ejbCreate
?*/
public?interface?TestHome?extends?javax.ejb.EJBHome{
????//创建EJB对象
????Test?create()?throws?java.rmi.RemoteException,javax.ejb.CreateException;
}4.本地Home接口
package?com.ejb2.test
/**
?*TestEJB组件的本地Home接口
?*/
public?interface?TestLocalHome?extends?javax.ejb.EJBLocalHome{
????//创建EJB对象
????TestLocal?create()?throws?javax.ejb.CreateException;
}
5.Bean类 TestBean.java
package?com.ejb2.test
/**
?*无状态会话Bean
?*/
public?class?TestBean?implements?javax.ejb.SessionBean{
????private?javax.ejb.SessionContext?ct;
????//EJB规范要求的实现
????public?void?ejbCreate(){
????????System.out.println("ejbCreate()");
????}
????public?void?ejbRemove(){
????????System.out.println("ejbRemove()");
????}????
????public?void?ejbActivate(){
????????System.out.println("ejbActivate()");
????}????
????public?void?ejbPassivate(){
????????System.out.println("ejbPassivate()");
????}????
????public?void?setSessionContext(javax.ejb.SessionContext?ct){
??????this.ct=ct;
????}????
????//业务方法
????public?String?test(){
????????System.out.println("test()");
????????return?"--------sucess---------";
????}
}6.EJB应用 TestClient.java
package?com.ejb2.test
/**
?*客户端代码,调用TestEJB组件中的业务方法
?*/
?public?class?TestClient{
?
?public?static?void?main(String[]?args)throws?Exception{
?????//设定jndi属性信息
?????Properties?pp?=?System.getProperties();
?????}???
?????//初始化上下文
?????Context?ct?=??new?InitialContext(pp);
?????//引用到Home对象,创建EJB对象工厂
?????Object?obj?=?ct.lookup("package?com.ejb2.test.TestHome");
?????//?转换成RMI-IIOP对象操作
?????TestHome?th?=?(TestHome)javax.rmi.PortableRemoteObject.narrow(obj,TestHome.class);
?????//创建Home?EJB对象
?????Test?test?=?test.create();
?????//调用EJB对象的test()方法,并在控制台显示结果
?????System.out.println(test.test());]
?????//销毁EJB对象
?????test.remove();
}
<?xml?version="1.0"?encoding="UTF-8"?>
<ejb-jar?version="3.0"?
xmlns="http://java.sun.com/xml/ns/j2ee"?
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
?<enterprise-Beans>
???<session>
????????<ejb-name>TestEJB</ejb-name>
????????<home>com.ejb2.test.TestHome</home>
????????<local-home>com.ejb2.test.TestLocalHome</local-home>
????????<local>com.ejb2.test.Testbean</local>
????????<session-type>Stateless</session-type>
????????<transaction-type>Container</transaction-type>
????</session>?
?</enterprise-Beans>????
</ejb-jar>?
??????? 是不是发现EJB3.0的开发步骤简化了许多呢,我刚接触EJB2.1的时候,开它的开发步骤看的我晕乎乎的,不过幸好当时边做项目边学它,很快就把它的开发步骤给弄通了,当我接触到EJB3.0的时候,就放开始学习3.0而把2.1的学习基本上放弃了。个人认为,即使以前没有接触过EJB2.x,也不影响你学习EJB3.0,没有接触过EJB的人,完全可以直接学习EJB3.0,而不用先学EJB2.x在学EJB3.0。????
??????? 3.0用业务接口来代替本地和远程的Home接口,本地客户和远程客户都通过业务接口调用EJB组件的业务方法。在调用EJB Bean类的业务方法时也做了改变,调用EJB Bean类的业务方法前,EJB容器会生成包裹类,调用EJB Bean类的业务方法前后,都会通过EJB容器成生的包裹类调用容器专有的API来获得中间件服务。