首页
JAVA笔记
数据库笔记
混乱记忆
小站记
您现在的位置
EJB 学习笔记。
简介: 学习了EJB,记录一个笔记。

设置SESSION Bean 的属性

@Stateless --被修饰的Bean为无状态的Bean
@Stateful --被修饰的Bean为有状态的Bean
【无状态:多个用户可以同时使用同一个Bean实例,需注意数据同步问题。】
【有状态:每一个线程都使用不同的Bean实例,不需注意数据同步问题。】

 

@Remote --被修饰的Bean被设置只能远程调用。
@Local --被修饰的Bean被设置只能本地调用。
【Remote:需要指定Bean的实现接口,可是同时指定多个】
【Local:需要指定Bean的实现接口,可是同时指定多个】
【同时实现远程和本地:一个Bean可同时被设置成Remote和Local】


改变Session Bean 的 jndi 名称

【jboss:在jboss中可以使用@LocalBinding和@RemoteBinding注释修改远程调用和本地调用的jndi名称】
【示例:
@Stateless
@Remote({Operation.class})
@RemoteBinding(jndiBeinding="远程调用的jndi名称")
@Local({LocalOperation.class})
@LocalBinding(jndiBinding="本地调用的jndi名称")

【weblogic10/Sun Application server/Glassfish:在以上容器中可以使用@Stateless.mappedName()注释来设置jndi名称】
【示例:
@Stateless(mappenName="调用时使用的jndi名称")  --无状态的Bean
@Stateful(mappenName="调用时使用的jndi名称")   --有状态的Bean

//如此指定后操作代码有少许不同:
InitialContext ctx = new InitialContext(props);
Operation operation (Operation)ctx.lookup("OperationBeanRemote#com.foshanshop.ejb3.Operation");
格式解释:OperationBeanRemote --调用时的jndi名称
     :com.foshanshop.ejb3.Operation --实现的接口报名+类名


Session Bean 的生命周期事件
@PostConstruct:当bean对象完成实例化后,标注了这个注释的方法会被立即调用,每一个bean class 只能定义一个@PostConstruct方法。这个注释同时适用于有状态和无状态的会话Bean。
@PreDestroy:标注了这个注释的方法会在容器销毁一个无用的或者过期的Bean实例之前调用。这个注释同时适用于有状态的和无状态会话bean。
@PrePassivate:当一个有状态的bean实例空闲时间过长,就会发生钝化(passivate)。标注了这个注释的方法会在钝化之前被调用。以后,任何针对该bean方法的调用,容器都会抛出例外。这个注释适用于有状态会话bean。
@PostActivate:当客户端再次使用已经被钝化的有状态的bean时,EJB容器会重新实例化一个Bean实例,并从硬盘中将之前的状态恢复。标注这个注释的方法会在激活完成时被调用。这个注释只适用于有状态的会话Bean。
@Init:这个注释指定了有状态Bean 初始化的方法,它区别于@PostConstruct注释在于:多个@Init注释方法可以同时存在于有状态session bean 中,但每个Bean 实例只会有一个@Init 注释的方法被调用。@postConstruct在@Init之后被调用。
@Rmove:当客户端调用标注了@Rmove注释的方法时,容器将在方法执行结束后把Bean实例删除。


事件拦截器
@Interceptors:注释指定一个或多个外部类中定义的拦截器,多个拦截器之间用逗号分隔。当注释修饰bean的时候表示拦截整个类,当注释修改时方法的时候表示拦截这个方法。
@AroundInvoke:当一个class 的谋一个方法被@AroundInvoke注释时表示这是一个拦截方法。
【拦截器方法示例:
@AroundInvoke
public object xxx(InvocationContext ctx)throws Exception{

Object obj = null;
//拦截前的业务操作
obj = proceed(); //执行被拦截的方法
//拦截后的业务操作

return obj;
}

默认拦截器:默认拦截器可以通过ejb-jar.xml配置
禁用默认拦截器:
@ExcludeDefaultInterceptors:使用该注释标注的Bean被设置为禁用默认拦截器。

 

ejb调用资源
要在Bean 中用其他EJB或资源,必须通过jndi查找或注入注释。
【示例:EJB Bean如何调用Bean
InitialContext ctx = new InitialContext();
(LocalHello) ctx.lookup("java:comp/env/ejb/HelloWorld");
//LocalHello 为HelloWorld的实现接口。 java:comp/env/ 为固定格式 为实现类。

-----------
通过java:comp/env/ejb/HelloWorld获取本地调用需要在查询前先往jndi enc 添加一个“ejb/HelloWorld”的指向HelloBean本地引用注册项。


【示例:EJB Bean如何调用Bean 
通过注释:

@EJB (beanName="Hellobean") LocalHello helloworld;
helloworld.SayHello("注入者");