【进阶EJB】深入探讨三种Bean(一)——Session Bean

    接着,我们继续EJB的学习。经过前两篇博客的介绍,我想大家已经对EJB有了一个初步的认识。但是大家想过没有,我们为什么要用EJB呢?


    why EJB?

    其中一个很重要的原因就是分布式!所谓分布式,就是分布式对象之间相互协作,完成特定的业务功能。通俗一点来说,就是我们不是把事情交给一个人去做,而是把事情划分一下,交给多个人去处理,最后把多个人处理的结果综合在一起得到最终的结果。与此同时,分布式对象之间能够实现分布透明性,亦或是位置透明性,即在客户端代码中无需指定分布式对象的位置;而且分布式对象之间支持事务;除此之外,应用程序需要支持不同的客户端,只需要少量的代码,就可以让远程客户端访问到企业Bean。

    所以,如果你的应用需要分布式部署;如果你的分布式对象需要支持事务;如果你的关键业务逻辑需要能够支持多种不同类型的客户端,那么EJB会是一个很好的选择。


    现在我们还没有说到今天这篇文章的重点。在最开始写EJB的第一篇博客里面,我们就介绍了依据EJB的特性不同,分为三种Bean,分别是Session Bean、Entity Bean和MessageDriven Bean。我们今天就要好好讨论一下那三种Bean。首先,Session Bean


    什么是Session Bean?

    Session Bean是用于实现业务逻辑的,每当客户发出一个请求的时候,容器就会选择一个Session Bean来为客户端服务,客户端通过调用Session Bean的方法来访问部署在服务器上的应用程序.Session Bean通过完成客户端的请求,从而对客户端隐藏了服务器内复杂逻辑的执行过程。


    需要使用Session Bean的情况:

    在任何给定的时间,只有一个客户端访问这个Bean的实例;Bean的状态不需要持久保存,只在一个时间段(可能是几个小时)内保存。

    

    分类:有状态的Session Bean和无状态的Session Bean

    根据状态管理模式的不同Session Bean分为有状态的Session Bean和无状态的Session Bean。


    有状态的Session Bean

    有状态的Session Bean是可以维护自身状态的,每个客户都有自己的实例,在用户保存生命周期内,有状态的Session Bean保持了用户的信息,即“状态”。

    建议采用有状态的Session Bean的情况:

·Bean需要描述一个于特定客户端的会话状态

·Bean需要在客户端的多个方法调用之间保存调用信息

·Bean作为应用程序的其他组件和客户端的中介者,呈现一个简单化的视图给客户端

·在调用接口里,Bean管理很多企业Bean的工作流。 


    无状态的Session Bean

    无状态的Session Bean主要用来实现单次使用的服务,该服务能够被启用多次,但是由于无状态Session Bean并不保存任何有关状态的信息,其效果是每次调用提供单独的使用。无状态的Session Bean分为两种Local接口和Remote接口。

    Local接口:

//无状态Session Bean定义本地接口
//通过@Local注释,说明本地接口
@Local
public interface LocalHelloworld{
	//打招呼方法
	public String sayHello(String name);
}

//定义Bean类
//通过@Stateless注释,说明无状态
@Stateless
public class LocalHelloworldBean implements LocalHelloworld{
	//其中implements LocalHelloworld实现本地接口,如果本地接口没有使用@Local注释,
	可在@Stateless注释下加@Local注释说明实现本地接口

	//打招呼方法
	public String sayHello(String name){
		return name + "您好!";
	}
}

    Remote接口:

//无状态Session Bean定义远程接口
//通过@Remote注释,说明远程接口
@Remote
public interface Helloworld{
	//打招呼方法
	public String sayHello(String name);
}


//编写Bean类
//通过@Stateless注释,说明无状态
@Stateless
public class HelloworldBean implements Helloworld{	
        //其中implements Helloworld实现远程接口,如果远程接口没有用@Remote注释,
	可以在@Stateless注释下加@Remote注释说明实现远程接口

	//打招呼方法
	public String sayHello(String name){
		return name + "您好!";	
	}
}


    建议采用无状态Session Bean的情况:

·Bean的状态不包含客户端相关的数据

·在一个单一方法调用中,Bean已经可以为客户端完成所需要的工作。例如,你可以用无状态会话Bean发一封邮件确认网络订单。

·Bean需要从数据库获取一些客户端经常访问的只读数据,你可以用这样的Bean来访问数据表代表这个月已经卖出的产品的行。


    有状态的Session Bean和无状态的Session Bean区别:

    从上面的叙述中,我们能够看出:有状态的Session Bean可以记录呼叫者的状态,因此每一个使用者都会有自己的一个实例;除此之外,有状态的Session Bean在其生命周期内只服务一个用户,正因为在生命周期内,有状态的Session Bean保持了用户的信息,所以我们称之为有状态的Session Bean.无状态的Session Bean虽然也是逻辑组件,但是它却不记录使用者的状态.


    还有一点想说的是,无状态的Session Bean会常用一些,因为无状态的Session Bean因为不保存用户信息,占的内存相对较小。而有状态的Session Bean因为保存着用户信息,所以占用内存会大一些,但是需要频繁访问的时候,并且多次访问之间需要共享一些信息的时候,就需要考虑使用有状态的Session Bean了。今天就说到这里,后续我们继续介绍另外两种Bean,敬请期待!

你可能感兴趣的:(EJB,Java)