EJB基础一 无状态会话BEAN使用

EJB基础一 无状态会话BEAN使用

EJBJ2EE的一条标准。以往EJB被人诟病,缺点是复杂,沉重。然后spring崛起了,spring因其轻量级,开发方便而得到了迅速地推广。但是这是过去了,EJB 2.X确实存在这个特点。但新标准的EJB 3.X却在向轻量级转变,而且开发效率可以说完全与spring相当。

要进行EJB开发,必须有EJB容器,tomcat是默认没有实现EJB的。实现了EJB的服务器有resinjboss as, jboss eap, jboss wildfly, glassfish, oracle weblogic, IBM webspere。这些服务器都有对应的eclipse插件,在eclipse market可以下载到。

如果eclipse安装完了对应的J2EE服务器插件,就可以添加服务器了,开发的时候新建dynamic web project的时候就可以选择server runtime,这样在开发过程中就不需要导入J2EE需要的那些jar文件。而且在部署的时候不需要将jar文件放入WEB-INF/lib中。

EJBbean分为以下几种

----会话BEAN

   |----有状态会话BEAN

       |----远程

       |----本地

   |----无状态会话BEAN

       |----远程

       |----本地

   |----单例BEAN

       |----远程

       |----本地

----消息驱动BEAN

----实体BEAN(已经是可选了)

实体BEAN是可选的,意思就是实体Bean可能不会有些服务器支持。请注意,这个东西不是JPA的实体。完全不一样!等于是说实体bean现在完全可以用JPA技术来代替了,而且用JPA技术代替也是趋势。

也就是分为两大类,而会话BEAN这个大类又分为了三种,每种又可以分为本地和远程两类。

有状态,无状态与单例的区别在于实例的数量上。单例最容易理解,就是只有一个实例。无状态会话BEAN是有一堆实例,也就是传说中的对象池。例如在JBOSS WILDFLY服务器中,无状态会话BEAN的实例数量是20个。这个20个也是可以配置的。

JBOSS wildfly的配置文件standalone.xml中,有这么两行配置


	
        	
                
        

Slsbstateless session bean的缩写,mdbmessage driven bean的缩写,在配置文件里可以看到不仅无状态会话bean的最大数量是20个,而且消息驱动bean的最大数量也是20个。

有状态会话BEAN则是根据请求新建的,请求完成之后立即销毁,所以可以说保存状态,在一定程度上避免了线程的并发问题。

本地BEAN和远程BEAN的区别就在于访问。本地BEAN只能在当前JVM内访问,而且还需要注意的是classloader的问题,比如JBOSS wildfly是有多级classloader的。所以本地bean最好还是限制在一个应用内访问,比如在一个web项目内访问。

而远程EJB是通过网络来访问的,其实是一种RPC调用,或者可以理解为远程访问调用RMI

个人认为远程EJB并不是一个最好的选择,REST服务,web service服务可能效果要比远程EJB服务要好用一点。

下面这个类是简单的无状态会话BEAN

package ejb;
 
import javax.ejb.Stateless;
 
@Stateless
public class HelloEjb {
 
	public String say(){
		return "Hello, world!";
	}
}

与spring相比,代码同样简洁。Spring的注解有@Service,@Component,@Repository,@Bean等注解来将一个对象放入容器中。但是spring的事务必须加注解来实现事务的AOP。与spring不同的是EJB不需要事务注解,只要是EJB实例,就在事务范围内,同spring一样,EJB的事务也需要抛出异常。所以在EJB的方法内,最好不要catch异常,而是抛出去,让控制器去catch异常,然后提醒用户。

在上面的代码里,没有指定是本地EJB还是远程EJB。没有加注解,默认是本地EJB的。EJB创建完成之后,可以使用多种方式调用。

比如在servlet中可以使用以下两种方式注入EJB

@EJB
private HelloEjb ejb;
@Resource(lookup="java:module/HelloEjb")
private HelloEjb ejb;
一般就是这两种方式。 @Resource 注解是用的 JNDI 方式来查询的,在 wildfly 服务器中,一个本地 EJB 6 JNDI 名称。

下面就是个例子

java:global/ejb/HelloEjb!ejb.HelloEjb

java:app/ejb/HelloEjb!ejb.HelloEjb

java:module/HelloEjb!ejb.HelloEjb

java:global/ejb/HelloEjb

java:app/ejb/HelloEjb

java:module/HelloEjb

你可能感兴趣的:(EJB)