EJB3学习之四----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)@MessageDrivenEntiry 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.ResourceResource的依赖注入EJB/WEB/应用程序客户端Javax.ejb.EJBSession Bean的依赖注入 Javax.jws.WebServiceRefWEB服务的依赖注入 Javax.persistence.PersistenceContext容器管理的Entity Manager依赖注入EJB/WEB/WEB APP Client Javax.persistence.PersistenceUnitEntityManagerFactory的依赖注入EJB/WEBJavax.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/WEBEJB加载注解的时机:当容器第一次加载客户端组件(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”);