? 作為現(xiàn)在市場占有率最高的Java EE的應(yīng)用服務(wù)器JBoss,對于最新的EJB3提出了自己的實(shí)現(xiàn),試用了一下,感覺只有一個(gè)字:爽。同時(shí)JBoss還對于原來沒有提高EJB容器的 Web服務(wù)器,如Tomcat,還提供了自己的嵌入式的實(shí)現(xiàn),也就是說,Tomcat也可以用EJB了。看來自從JBoss轉(zhuǎn)業(yè)為一個(gè)商業(yè)公司以后,其技術(shù)水平也已經(jīng)成為一個(gè)世界級的Java開發(fā)公司了。同時(shí)JBoss的EJB除了可以利用Annotation來實(shí)現(xiàn)EJB以外,還可以利用deloy- descriptor把一個(gè)普通的Bean來轉(zhuǎn)化為一個(gè)EJB,而不需要在源程序里面加入Annotation,這個(gè)功能還是比較厲害的。其利用Jacc 來改變你的class功能,自動在部屬階段加入了Annotation來實(shí)現(xiàn)EJB3。到這里,不禁佩服Java現(xiàn)在的發(fā)展程度,可以有很多種方法來改變已經(jīng)編譯的class文件,如cgilib、jasssit,aspectJ、SpringAOP等,同時(shí)不禁想起那幾天研究的antlr(一個(gè)類似與 YACC的語言開發(fā)工具),唉,看來國外對于Java的應(yīng)用真是太出神入化了。
?? 用JBoss來開發(fā)EJB3,必須下載JBoss的EJB3開發(fā)工具,把他加入到JBoss里面(最好是最新版本,現(xiàn)在(2006-2-7)是JBoss4.0.3SP1.
(一)安裝步驟如下:
?? 1、下載JBoss-ejb-3.0
?? 2、解壓文件。
?? 3、拷貝lib目錄下面的xml文件和jboss-aop-jdk50.deployer目錄到j(luò)boss-4.0.x/server/all/deploy下面
?? 4、拷貝lib目錄下面的jboss-xb.jar到j(luò)boss-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良好的微內(nèi)核結(jié)構(gòu),所以對于EJB3的支持還是比較方便的。
(二)實(shí)際開發(fā)
?? 同原來的開發(fā)Web程序一樣,把開發(fā)完成的東西拷貝到j(luò)boss-4.0.x/server/all/deploy下面,是一個(gè)jar文件,不過后綴名必須是.ejb3,這樣
JBoss會自動發(fā)現(xiàn)并加載,如果沒有出現(xiàn)錯(cuò)誤提示,一般就是成功的。
?? 下面,開發(fā)一個(gè)Stateless類型的EJB吧
?? 在所有的EJB3.0規(guī)范中定義的EJB,都不必實(shí)現(xiàn)Home接口。
?? 1、定義接口:
?? package com.gm.ejb3;
? import javax.ejb.Remote;
?
?? @Remote????
?? public interface ICounter
?? {
??? public int add(int i);
??? public int getNumber();
?? }
?? 注意@Remote這個(gè)Annotation,它表明這是一個(gè)遠(yuǎn)程接口,同意@Local表明是一個(gè)本地接口。
?? 2、定義實(shí)現(xiàn):
?? 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、寫一個(gè)Client來調(diào)用:
???需要一個(gè)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文件的內(nèi)容:
???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。
???感覺還是比較輕松吧。以前開發(fā)過EJB的,一定有一種非常放松的感覺,太爽了。世界本來就是應(yīng)該就是這么簡單啊!
???同時(shí)JBoss的EJB3開發(fā)包里面有教學(xué)文件,非常的全面,可以從那里開始EJB3的開發(fā)旅程。