随着Java 5.0的发布,Java的一些新的语言特点也开始被大家所关注,如Annotation、GenericType等。由于现在Java在企业级软件应用市场里面占据统治地位,所以新的语言特征对于原来的J2EE的也有一些非常大的变化。相对于原来的EJB2的一些批评,如开发速度缓慢,难以测试等,一些优秀的公司也开始利用Java语言的新特征来解决。其中Annotation对于Ejb的促进作用还是比较显著的。接触过原来的EJB2开发的人来说,对于那些复杂的Xml描述文件和复杂的类别关系相比都印象非常的深刻。
作为现在市场占有率最高的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的开发旅程。
posted on 2006-11-13 11:34
还没想好名 阅读(414)
评论(1) 编辑 收藏