EJB 3.0开拓指南之无状态会话Bean
当前位置:以往代写 > JAVA 教程 >EJB 3.0开拓指南之无状态会话Bean
2019-06-14

EJB 3.0开拓指南之无状态会话Bean

EJB 3.0开拓指南之无状态会话Bean

副标题#e#

在所有的EJB3.0类型中界说的EJB,都不必实现Home接口。

一个会话Bean必需有一个业务接口,这个接口由会话Bean来实现,可能也可以由会话Bean来发生。这样,你可以只写一个文件,就可以生成业务逻辑实现类、长途接口、当地接口等。


@Remote
@Local
@Stateless
public class CounterBean
{
……
}

在今朝jboss的实现中,必需要有一个独立的业务接口。

这个接口不必实现EJBObject可能EJBLocalObject。

一个无状态会话Bean 必需利用Stateless注释,以表白它是一个无状态的会话Bean。EJB容器将按照这个注释来鉴定它的范例。可能实现javax.ejb.SessionBean接口。

一个无状态的会话Bean可以实现setSessionContext要领,也可以不实现。

一个无状态的会话Bean可以实现ejbCreate/ejbRemove要领。

一个无状态的会话Bean可以通过依赖注入(Dependency Injection)也就是此刻吵得挺火的IOC获取容器的资源和情况属性。具体先容请看后头的章节。

在Eclipse中导入本文提供的例子Stateless。

这个例子是一个计数器的例子,它实现了两个业务要领add和getNumber,add要领就是给计数器加上一个整数值,getNumber要领将获得计数器的当前值。

这个例子主要有5个文件:

Counter.java:业务接口。

CounterBean.java:业务实现类。未来我们开拓的EJB也都是这样定名(在接口名上加上Bean)。

Client.java:测试EJB的客户端类。

jndi.properties:jndi属性文件,提供会见jdni的根基设置属性。

Build.xml:ant 设置文件,用以编译、宣布、测试、排除EJB。

下面针对每个文件的内容做一个先容。

Counter.java
package com.kuaff.ejb3.stateless;
import javax.ejb.Remote;
@Remote
public interface Counter
{
public int add(int i);
public int getNumber();
}

这个接口很简朴,界说了上面先容的两个业务要领,同时,我们为这个接口加上了Remote注释,这样我们的长途客户端就可以通过JNDI名称查找到它,并挪用它的业务要领。


#p#副标题#e#

它的JNDI名称怎么设置呢?

你不必设置它的JNDI名称,也不必写它的设置文件。在JBOSS实现的EJB3.0中,你不必写任何的EJB陈设文件和jboss陈设文件。JBOSS默认利用接口的全称作为它的JNDI名。在上面的例子中,它的全称就是:

com.kuaff.ejb3.stateless.Counter,你也可以通过Counter.class.forName()获得。

CounterBean.java
package com.kuaff.ejb3.stateless;
import javax.ejb.Stateless;
@Stateless
public class CounterBean implements Counter
{
private int number = 0;
//给计数器加上i
public int add(int i)
{
number += i;
return number;
}
//获得当前的计数
public int getNumber()
{
return number;
}
}

这个是计数器的实现类。留意这个类利用Stateless做了注释,这是必需的。

Client.java
package com.kuaff.ejb3.stateless;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Client
{
public static void main(String[] args)
{
InitialContext ctx;
try
ctx = new InitialContext();
Counter counter = (Counter) ctx.lookup(Counter.class.getName());
counter.add(10);
System.out.println("当前的number:" + counter.getNumber());
counter.add(10);
System.out.println("当前的number:" + counter.getNumber());
Counter counter2 = (Counter) ctx.lookup(Counter.class.getName());
counter2.add(10);
System.out.println("当前的number:" + counter2.getNumber());
catch (NamingException e)
{
e.printStackTrace();
}

}
}

这个类用来测试我们宣布的计数器EJB。首先通过ctx = new InitialContext();获得上下文,然后通过lookup查找计数器,然后给计数器加10,显示当前的计数器信息。

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

#p#副标题#e#

这个文件设置了JNDI操纵所需的属性,因为我们是测试本机的EJB处事,所以不必修改上面的属性。

Build.xml

<project name="kuaff_ejb3_tutorial" default="ejbjar" basedir=".">
<property environment="env"/>
<property name="src.dir" value="${basedir}/src"/>
<property name="jboss.home" value="${env.JBOSS_HOME}"/>
<property name="build.dir" value="${basedir}/build"/>
<property name="build.classes.dir" value="${build.dir}/classes"/>
<path id="classpath">
<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.deployer">
<include name="*.jar"/>
</fileset>
<pathelement location="${build.classes.dir}"/>
<pathelement location="${basedir}"/>
</path>
<property name="build.classpath" refid="classpath"/>
<target name="prepare">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes.dir}"/>
</target>
<target name="compile" depends="prepare">
<javac srcdir="${src.dir}"
destdir="${build.classes.dir}"
debug="on"
deprecation="on"
optimize="off"
includes="**">
<classpath refid="classpath"/>
</javac>
</target>
<target name="ejbjar" depends="compile">
<jar jarfile="build/StatelessSample.ejb3">
<fileset dir="${build.classes.dir}">
<include name="**/*.class"/>
</fileset>
</jar>
<copy file="build/StatelessSample.ejb3" todir="${jboss.home}/server/all/deploy"/>
</target>
<target name="run" depends="ejbjar">
<java classname="com.kuaff.ejb3.stateless.Client" fork="yes" dir=".">
<classpath refid="classpath"/>
</java>
</target>
<target name="clean.db">
<delete dir="${jboss.home}/server/all/data/hypersonic"/>
</target>
<target name="clean">
<delete dir="${build.dir}"/>
<delete file="${jboss.home}/server/all/deploy/StatelessSample.ejb3"/>
</target>
</project>

请运行{$JBOSS_HOME}/bin目次下的run.bat: run –c all,启动JBOSS。

在Eclipse的Ant视图中执行ejbjar target。可能在呼吁行下,进入到此工程目次下,执行ant ejbjar,将编译打包宣布此EJB。

在Eclipse的Ant视图中执行run target。可能在呼吁行下,进入到此工程目次下,执行ant run,测试这个EJB。

    关键字:

在线提交作业