EJB定义了3种企业级Bean,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriver Bean)。
Session Bean用于实现业务逻辑,他可以是有状态的(有状态Bean),也可以是无状态的(无状态Bean),每当客户发出请求时,容器就会选择一个Session Bean 为客户端服务。
Session Bean可以直接访问数据库,但更多的时候,它会通过Entity Bean来访问数据库。
要开发一个Session Bean,我们需要定义接口和Bean class,其中接口分为远程(remote)和本地(local)接口。在EJB3.0中不要求你同时实现remote和local接口,但实现两者是比较好的做法。
1)远程接口(remote interface):定义了session bean的业务方法,这些方法可以被来自EJB容器之外的应用访问到。
2)本地接口(local interface):同样定义了session bean的业务方法,这些方法可以被同处于EJB容器内的其他应用使用。因为local接口允许bean直接通过内存交互,没有分布式对象协议的开销,从而改善了性能。
3)bean类(bean class):bean class包含了业务逻辑,它必须具备一个远程或本地接口,在Bean类,我们应该实现接口的业务方法,尽管这并不是必须的,但我们没理由不这样做。
一,实现remote无状态会话Bean
public interface HelloWorld{
public String sayHello(String name);
}
要开发一个会话Bean ,首先要定义一个包含他所有业务方法的接口,这个接口不需要任何的注释,就和普通的java接口一样。
二,实现业务接口
@Stateless //定义一个无状态会话Bean
@Remote({HelloWorld.class}) //指明这个无状态会话Bean的Remote接口
public calss HelloWorldBean implements HelloWorld{
public String sayHello(String name){
return name+“说:你好,初次见面,EJB3.0世界”;
}
}
-----无状态会话Bean原理
由于无状态会话Bean不维护会话状态,意味着一个bean实例可以可以为多个用户服务,因此EJB容器使用实例池化技术管理无状态会话Bean。简单的说就是:当无状态会话Bean应用到部署服务器时,EJB容器会为他预先创建一些bean实例放在对象池,当有用户访问EJB方法时,EJB容器会从对象池中取出一个实例为之服务,服务我完了就回到对象池,当下一个用户在访问EJB方法时,EJB容器有可能再次把该实例为之服务,正因为如此,无状态会话bean只需要少量实例就可以为成千上百的用户服务,大大提高了系统性能。
由于无状态会话Bean能够支持多个用户,并且通常都在EJB容器中共享,可以为需要大量客户的应用提供更好的扩充能力,无状态会话Bean比有状态会话Bean更具性能优势,在条件允许的情况下,应优先使用无状态会话Bean。