欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ejb3

程序员文章站 2022-05-28 16:28:21
...
EJB3新特性
元数据注解
依赖注入


一 EJB3新特性
相比EJB3以前的版本而言,增加了两个新特性:元数据注解(Annotation) 和依赖注入(Injection),而元数据注解以最大限度的使部署描述符从冗余繁杂中脱离出来。

二 元素据注解
元数据注解,来源于Java EE 5中的Annotation----javax.annotation.*.一般而言,对于定义SLSB(Stateless Session Bean)而言,@Stateless;对于SFSB(Stateful Session Bean)而言,@Stateful;
下面归纳下EJB3中的常用注释:
[table]
|类型|注释
|Stateless| Session Bean(javax.ejb.Stateless) @Stateless
|Stateful |Session Bean(javax.ejb.Stateful) @Stateful
|Local接口 |(Javax.ejb.Local) @Local
|Remote接口|(Javax.ejb.Remote) @Remote
|Message Driven Bean(MDB) | (javax.ejb.MessageDriven) @MessageDriven
|Entiry Bean(实体Bean) | @Entity
|Javax.ejb.remove | @Remove(当一个Session完成时,自动调用Remove)
|Javax.ejb.EJB | @EJB(表示注入实例)
|Javax.annotation.Resource | @Resource(name=”jms/QueueConnectionFactory”)
[/table]
当然,EJB注入和Resource注入相比,Ejb注入只是针对于EJB而言,而Resource注入即是对所有的文件都可以进行注入。
Eg:

1) @EJB Private HelloWorld helloWorld;
2) @Remove Public String getUserName(String userName);
3) @Resource(name=”jms/QueueConnectionFactory”) Private ConnectionFactory connectionFactory;
4) @MessageDriven{
activationConfig = {
@ActivationConfigProperty{
propertyName=”destinationName”,
propertyValue=”jms/HelloWorldQueue”
}
}

当然,在MDB消息驱动中,MDB实现了Javax.jms.MessageListener接口。
5)
 
@Entity
@Table{name=”User”}
Pubic class User implements Serializable{
Private Long userId;
@Id
@GeneratedValue(Strategy=GenerationType.AUTO)
@Column(name=”USER_ID”)
Public Long getUserId(Long userId){
Return userId;
}

}

对于在EJB2中,使用容器管理的持久化(Container-Managed Persistence---CMP)实体Bean生成主键困难很多。
下表中说明了J2EE中引入的主要元数据注解。
注解 用途 可用的组件

Javax.annotation.Resource Resource的依赖注入 EJB/WEB/应用程序客户端
Javax.ejb.EJB Session Bean的依赖注入
Javax.jws.WebServiceRef WEB服务的依赖注入
Javax.persistence.PersistenceContext 容器管理的Entity Manager依赖注入 EJB/WEB/WEB APP Client
Javax.persistence.PersistenceUnit EntityManagerFactory的依赖注入 EJB/WEB
Javax.annotation.PostConstruct 生命周期方法
Javax.annotation.PreDestory 生命周期方法
Javax.annotation.security.RunAs 安全
Javax.annotation.security.RolesAllowed 安全 EJB
Javax.annotation.security.PermitAll 安全
Javax.annotation.security.DenyAll 安全
Javax.annotation.security.DeclareRoles 安全 EJB/WEB

EJB加载注解的时机:当容器第一次加载客户端组件(eg:Servlet)的时候,发现有元数据注释,它将在后台或者RMI Lookup 这个EJB,从而设置可获得的EJB引用。
下面举个注释的例子:

当然,我们在大型系统的开发中,也会经常用到元数据注释和部署描述符混合使用。下面就是一个创建Ejb Stateless Session Bean例子(ejb-jar.xml):

<enterprise-beans>
<session>
<ejb-name>HelloWordBean</ejb-name>
<local>com.ejb3.client.Bean</local>
<ejb-class>com.ejb3.ejbBean.userBean</ejb-class>
<session-type> Stateless </session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>

三 依赖注入(Injection)
依赖注入是通用元数据注解的前端和中心,包含@Resource,@EJB,@WebServ ice-Ref,@PersistenceContext和@PersistenceUnit注解。在Spring Framework中得到很好的体现。
其实关于EJB中依赖注入而言,应该从JNDI查找来说起。若使用过EJB2,就应该知道JNDI实现方式。在JNDI查找Bean过程中,是EJB主动驱动JNDI去lookup其相匹配的资源和Bean;而依赖注入恰恰相反,是资源文件或者Bean通过容器去注入到EJB中,从而让容器处理服务或资源的实例化,初始化以及把服务或资源引用给Client等等复杂的工作,是一种被动的操作。当然,所谓的主动和被动,都是以EJB为主体。

JNDI查找的Sample:

InitialContext context = new InitialContext();
TestEjb testEjb = (TestEjb)context.lookup(“TestEjbBean/Remote”);