先說說EJB3.0吧:
EJB3.0,不需要創建Home和對象接口,不需要組件接口(javax.ejb.SessionBean和javax.ejb.MessageDrivenBean),使用java元數據註釋(@? 其中“?“表示註釋名),簡化了EJB環境的API。
/**
* Test的業務接口
*/
public interface Test {
/**
* @return返回成功消息給用戶
*/
public String test();
}
2.創建一個無狀態會話bean TestBean.java類
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
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());
}
}
<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
/**
*TestEJB組件的遠程接口,
*/
public interface Test extends java.ejb.EJBObject{
//用於返回成功消息的方法
public String test() throws java.rmi.RemoteException;
}
*TestEJB組件的本地接口,
*/
public interface TestLocal extends java.ejb.EJBLocalObject{
//用於返回成功消息的方法
public String test();
}
/**
*TestEJB組件的Home接口,
×create()()方法方法對應於TestBean中的ejbCreate
*/
public interface TestHome extends javax.ejb.EJBHome{
//創建EJB對象
Test create() throws java.rmi.RemoteException,javax.ejb.CreateException;
}
/**
*TestEJB組件的本地Home接口
*/
public interface TestLocalHome extends javax.ejb.EJBLocalHome{
//創建EJB對象
TestLocal create() throws javax.ejb.CreateException;
}
/**
*無狀態會話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---------";
}
}
/**
*客戶端代碼,調用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();
}
7.部署描述符
<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。
從上面例子的比較可以看出EJB2.x ,EJB3.0業務方法調用變得不同了。
2.x本地客戶和遠程客戶通過home接口創建了本地(本地home接口)或遠程(遠程home接口)EJB對象引用,EJB對象會生成EJB Home接口和EJB對象接口對應的實現。 客戶通過本地或遠程EJB對象接口調用業務方法。調用EJB Bean類中的業務方法前,容器生成的EJB對象會調用容器專有的API來獲得中間件服務,在調用EJB Bean類的業務方法後,容器生成的EJB對象會調用容器專有的API來獲得中間件服務。
3.0用業務接口來代替本地和遠程的Home接口,本地客戶和遠程客戶都通過業務接口調用EJB組件的業務方法。在調用EJB Bean類的業務方法時也做了改變,調用EJB Bean類的業務方法前,EJB容器會生成包裹類,調用EJB Bean類的業務方法前後,都會通過EJB容器成生的包裹類調用容器專有的API來獲得中間件服務。