ejb3

EJB3新特性
元数据注解
依赖注入


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

二 元素据注解
  元数据注解,来源于Java EE 5中的Annotation----javax.annotation.*.一般而言,对于定义SLSB(Stateless Session Bean)而言,@Stateless;对于SFSB(Stateful  Session Bean)而言,@Stateful;
下面归纳下EJB3中的常用注释:
类型 注释                                             
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”)

当然,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”); 

你可能感兴趣的:(bean,Web,jms,ejb,Security)