EJB3.0学习笔记

一.EJB3.0分为会话Bean(session bean),MDB(message driver bean)消息驱动Bean,实体Bean(Entity Bean)

1.session bean 又分为有状态的(stateful)和无状态的(stateless)

stateful session bean 就相当于一次会话,每个客户端得到的是一个不同的session bean,EJB通过一个Bean工厂生成不的session bean,
并且由一个bena 容器进行统一管理,每生成的一个session bean 都由这个bean容器管理.客户端与session bean 之间是一一对应的.

stateless session bean 在EJB内部是一种单例模式,每个客户端得到的始终都是同一个session bean.

就性能上来说,stateless session bean 优于 stateful session bena ,因为stateless session bean 较stateful session bean 占用更少
的少的系统资源.但就EJB本身来说,它是一种提供分布式调用的组件,其性能肯定不是很理想,所以在开发EJB时要考虑到程序的粗粒细度
用来完成同一件事的逻辑最好写在同一个方法中,不要像我们平时写程序那样把完成一件事的逻辑分得很细.


2.EJB3.0有两种调用方式:@Remote 远程调用,@Local 本地调用.
remote 采用传参的形式传送数据, Local 采用传址的方式传送数据,remote 是运行在不同的JVM上,而Local是运行在同一个上JVM的

3.EJB3.0注释

@Stateless //无状态会话EJB
@Remote ({Operation.class}) //远程接口
@Local ({LocalOperation.class}) //本地接口
当一个类实现多个接口时,我们必须申明哪个接口是用来作远程调用的,哪个接口是用来做本地调用的.

@SuppressWarnings("serial")   //屏蔽缺少serialVersionUID 定义的警告
@Stateful //有状态会话EJB

@Remote ({Operation.class})
@RemoteBinding (jndiBinding="foshanshop/RemoteOperation") //重新梆定JNDI
@Local ({LocalOperation.class})
@LocalBinding (jndiBinding="foshanshop/LocalOperation")  //重新梆定JNDI
@PostConstruct:当bean对象完成实例化后,使用了这个注释的方法会被立即调用。这个注释同时适用于有状态和无状态的会话bean。

@PreDestroy:使用这个注释的方法会在容器从它的对象池中销毁一个无用的或者过期的bean 实例之前调用。这个注释同时适用于有状态和无状态的会话bean。
@PrePassivate:当一个有状态的session bean实例空闲过长的时间,容器将会钝化(passivate)它,并把它的状态保存在缓存当中。使用这个注释的方法会在容器钝化bean实例之前调用。这个注释适用于有状态的会话bean。当钝化后,又经过一段时间该bean 仍然没有被操作,容器将会把它从存储介质中删除。以后,任何针对该bean方法的调用容器都会抛出例外。

@PostActivate:当客户端再次使用已经被钝化的有状态session bean时,新的实例被创建,状态被恢复。
使用此注释的session bean会在bean的激活完成时调用。这个注释只适用于有状态的会话bean。
@Init:这个注释指定了有状态session bean初始化的方法。它区别于@PostConstruct注释在于:多个@Init
注释方法可以同时存在于有状态session bean 中,但每个bean实例只会有一个@Init注释的方法会被调用。这取
决于bean是如何创建的(细节请看EJB 3.0规范)。@PostConstruct在@Init之后被调用。

@Remove //移除EJB

@Interceptors 注释指定一个或多个在外部类中定义的拦截器。上面拦截器HelloInterceptor 对HelloChinaBean中的所有方法进行监听

@AroundInvoke 注释指定了要用作拦截器的方法。用@AroundInvoke注释指定的方法必须遵守以下格式:public Object XXX(InvocationContext ctx) throws Exception
XXX 代表方法名可以任意。

@EJB (beanName="HelloWorldBean") jndi: @EJB (mappedName="HelloWorldBean/remote") //依赖注入(dependency injection)

消息驱动EJB

@MessageDriven(activationConfig = //指明这是一个消息驱动Bean
{
@ActivationConfigProperty(propertyName="destinationType", //配置消息的各种属性
propertyValue="javax.jms.Queue"), //指定消息的类型 topic 为javax.jms.Topic
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/foshanshop")}) //指定消息路径,消息驱动Bean在发布时,如果路径不存在,容器会自动创建该路径,当容器关闭时该路径会自动被删除

实体EJB

@Entity
@Table(name = "Person")

@Entity注释指明这是一个实体Bean,每个实体Bean类映射数据库中的一个表

@Table注释的name属性指定映射的数据表名称

@Column注释定义了映射到列的所有属性,如列名是否唯一,是否允许为空,是否允许更新等,他的属性介绍如
下:
·name: 映射的列名。如:映射Person表的PersonName列,可以在name属性的getName 方法上面加入
@Column(name = "PersonName"),如果不指定映射列名,容器将属性名称作为默认的映射列名。
·unique: 是否唯一
·nullable: 是否允许为空
·length: 对于字符型列,length属性指定列的最大字符长度
·insertable: 是否允许插入
·updatable: 是否允许更新
·columnDefinition: 定义建表时创建此列的DDL
·secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。
@Id 注释指定personid属性为表的主键,它可以有多种生成方式:
·TABLE:容器指定用底层的数据表确保唯一。
·SEQUENCE:使用数据库的SEQUENCE 列来保证唯一
·IDENTITY:使用数据库的INDENTIT列来保证唯一
·AUTO:由容器挑选一个合适的方式来保证唯一
·NONE:容器不负责主键的生成,由调用程序来完成。
@GeneratedValue注释定义了标识字段的生成方式,本例personid的值由MySQL数据库自动生成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值