? 作為現在市場占有率最高的Java EE的應用服務器JBoss,對于最新的EJB3提出了自己的實現,試用了一下,感覺只有一個字:爽。同時JBoss還對于原來沒有提高EJB容器的 Web服務器,如Tomcat,還提供了自己的嵌入式的實現,也就是說,Tomcat也可以用EJB了。看來自從JBoss轉業為一個商業公司以后,其技術水平也已經成為一個世界級的Java開發公司了。同時JBoss的EJB除了可以利用Annotation來實現EJB以外,還可以利用deloy- descriptor把一個普通的Bean來轉化為一個EJB,而不需要在源程序里面加入Annotation,這個功能還是比較厲害的。其利用Jacc 來改變你的class功能,自動在部屬階段加入了Annotation來實現EJB3。到這里,不禁佩服Java現在的發展程度,可以有很多種方法來改變已經編譯的class文件,如cgilib、jasssit,aspectJ、SpringAOP等,同時不禁想起那幾天研究的antlr(一個類似與 YACC的語言開發工具),唉,看來國外對于Java的應用真是太出神入化了。
?? 用JBoss來開發EJB3,必須下載JBoss的EJB3開發工具,把他加入到JBoss里面(最好是最新版本,現在(2006-2-7)是JBoss4.0.3SP1.
(一)安裝步驟如下:
?? 1、下載JBoss-ejb-3.0
?? 2、解壓文件。
?? 3、拷貝lib目錄下面的xml文件和jboss-aop-jdk50.deployer目錄到jboss-4.0.x/server/all/deploy下面
?? 4、拷貝lib目錄下面的jboss-xb.jar到jboss-4.0.x/server/all/lib。
?? 5、刪除jboss-4.0.x/server/all/deploy下面的jboss-hibernate.deployer和jboss-aop.deployer目錄。
?? 6、用run.bat -c all來啟動就可以了。
?? 由于JBoss良好的微內核結構,所以對于EJB3的支持還是比較方便的。
(二)實際開發
?? 同原來的開發Web程序一樣,把開發完成的東西拷貝到jboss-4.0.x/server/all/deploy下面,是一個jar文件,不過后綴名必須是.ejb3,這樣
JBoss會自動發現并加載,如果沒有出現錯誤提示,一般就是成功的。
?? 下面,開發一個Stateless類型的EJB吧
?? 在所有的EJB3.0規范中定義的EJB,都不必實現Home接口。
?? 1、定義接口:
?? package com.gm.ejb3;
? import javax.ejb.Remote;
?
?? @Remote????
?? public interface ICounter
?? {
??? public int add(int i);
??? public int getNumber();
?? }
?? 注意@Remote這個Annotation,它表明這是一個遠程接口,同意@Local表明是一個本地接口。
?? 2、定義實現:
?? package com.gm.ejb3;
? import javax.ejb.Stateless;
?
?? @Stateless????
?? public class GCounter implements ICounter
?? {
?? ?private int num=0;
??? public int add(int i)
??? {
??? ?num+=i;
??? }
??? public int getNumber()
??? {
??? ?return num;
??? }
?? }
?? 3、Ant文件build.xml
?? ?<?xml version="1.0"?>
??<!-- ======================================================================
???? 2006-2-7 8:53:16???????????????????????????????????????????????????????
???? ejb3???
???? A JBoss ejb3
??????????????????
???? Administrator???????????????????????????????????????????????????????????????
???? ====================================================================== -->
??<project name="ejb3" default="ejbjar">
???? <description>
???????????? A JBoss ejb3
???? </description>
??? <property name="jboss.home" value="jboss目錄"/>
???<property name="src.dir" value="src"/>
???<property name="build.dir" value="build"/>
???<property name="build.class.dir" value="${build.dir}/classes"/>
??
???<path id="project.class.path">??
???? <fileset dir="${jboss.home}/lib">
?????????? <include name="**/*.jar"/>
??????? </fileset>
??
??????? <fileset dir="${jboss.home}/server/all/lib">
?????????? <include name="**/*.jar"/>
??????? </fileset>
??
??????? <fileset dir="${jboss.home}/server/all/deploy/ejb3.deployer">
?????????? <include name="*.jar"/>
??????? </fileset>
??
??????? <fileset dir="${jboss.home}/server/all/deploy/jboss-aop-jdk50.deployer">
?????????? <include name="*.jar"/>
??????? </fileset>
??
??????? <pathelement location="${build.class.dir}"/>
???</path>
??
??
????? <!-- =================================
??????????? target: init?????????????
?????????? ================================= -->
????? <target name="init" description="--> description">
????? ?<mkdir dir="${build.dir}"/>???
????? ?<mkdir dir="${build.class.dir}"/>
????? </target>
??
??
????? <!-- =================================
??????????? target: compile?????????????
?????????? ================================= -->
????? <target name="compile" depends="init" description="--> description">
????? ?<javac srcdir="${src.dir}"
?????????? destdir="${build.class.dir}"
?????????? debug="on">
????? ?<classpath refid="project.class.path"/>
????</javac>???
????? </target>
??
??
????? <!-- =================================
??????????? target: ejbjar?????????????
?????????? ================================= -->
????? <target name="ejbjar" depends="compile" description="--> A JBoss ejb3">
?????? ?<jar jarfile="${build.dir}/GCounter.ejb3">
?????<fileset dir="${build.class.dir}" id="allclass">
???????? <include name="**/**.class"/>
??????<exclude name="**/**Client.class"/>
?????</fileset>
?????? ??
?????? ?? <fileset dir=".">
?????????????? <include name="META-INF/*.xml"/>
??????????? </fileset>
?????? ?</jar>
????? ?<copy file="${build.dir}/GCounter.ejb3" todir="${jboss.home}/server/all/deploy"/>
????? </target>
???
???
????? <!-- =================================
??????????? target: runClient?????????????
?????????? ================================= -->
????? <target name="runClient" description="--> description">
????????? <java classname="com.gm.ejb3.Client" fork="yes" dir=".">
????????? ?<classpath refid="project.class.path"/>
????????? </java>
????? </target>
??
????? <!-- - - - - - - - - - - - - - - - - -
??????????? target: depends?????????????????????
?????????? - - - - - - - - - - - - - - - - - -->
????? <target name="depends">
????? </target>
?
???</project>
???
???4、寫一個Client來調用:
???需要一個jndi.properties文件,放在根目錄下面
????java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
????java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
????java.naming.provider.url=localhost
????? client文件的內容:
???package com.gm.ejb3;
???import javax.naming.Context;
???import javax.naming.InitialContext;
???import javax.naming.NamingException;
???
???public class Client {
???
????/**
???? * @param args
???? */
????public static void main(String[] args) {
?????// TODO Auto-generated method stub
?????try {???
??????Context ctx=new InitialContext();
??????ICounter counter=(ICounter) ctx.lookup(ICounter.class.getName()); //缺省情況下,JNDI名稱就是你的接口名
??????
??????counter.Add(100);
??????System.out.println("Now Count is "+counter.getNumber());
??????
??????counter.Add(50);
??????System.out.println("Now Count is "+counter.getNumber());
?????} catch (NamingException e) {
??????// TODO Auto-generated catch block
??????e.printStackTrace();
?????}
????}
???
???}
???5、測試一下,用ant runClient。
???感覺還是比較輕松吧。以前開發過EJB的,一定有一種非常放松的感覺,太爽了。世界本來就是應該就是這么簡單啊!
???同時JBoss的EJB3開發包里面有教學文件,非常的全面,可以從那里開始EJB3的開發旅程。