南阳金秋怡源花园公寓:EJB 笔记 -Chapter07 资源注入

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 21:48:24

Chapter07  资源注入

一、EJB之间的相互调用

  1、EJB之间的相互调用可以采用以下四种方式:

  (1)使用默认的JNDI上下文

  (2)使用@EJB标注(推荐)

  (3)使用EJB Context查找

  (4)使用本地接口

 

EJB扩展组件

 

EJB的依赖注入,都是依赖于JNDI的。

在EJB组建中调用其他的EJB组件

2、EJB调用方式:标注

@EJB:

可以借助于JNDI,查找到其他EJB组件,也可以借助于业务接口,调用EJB实例中的业务方法,也可以直接引用其他的需要的EJB组件的业务接口,但是需要使用标注。

标注类型一:

@EJB

privateTaxRateRemote taxRate;

需要配置ejb-ref值,配置文件是容器特定的,并且ejb-ref-name的值是lab.morefunnction.PriceBean/taxRate,lab.morefunnction.PriceBean是要访问的EJB的全限定名,taxRate是被访问的EJB引用。

标注类型二:

@EJB(name=“taxRate”)

privateTaxRateRemote taxRate;

同样需要配置(sun-ejb-jar.xml)中的ejb-ref-name的值:“taxRate”,EJB引用名与JNDI名字之间的映射。

 

3、EJB调用方式:EJB Context查找

EJB Context

  EJB容器提供给EJB的一个对象,用来给EJB访问EJB容器调用的一个接口。

 

二、EJB的固有标注

@Statless@Statful @MessageDriven

name="",mappedName="" description=" "

name属性是标识EJB的名字(可以通过JNDI来查找)。默认是EJB的名字。

mappedName属性也是标识EJB的名字的是容器相关的,所以不要重置,降低可移植性。

description属性是EJB的描述内容。

以上3个属性是3个标签共有的属性。

 

@Remote @Local

这两个标注是标注业务接口的,分别是标注远程的和本地的商业接口的,如果不写那就默认为本地的。

①不能直接调用EJB,必须通过业务接口去访问;

②如果客户端与EJB运行在同一个容器当中,用本地业务接口访问,则性能更高。因为使用本地业务接口,就避免了RMI调用,即避免了网络调用的性能损耗。通过Reference(引用),而不是Stub,Skeleton编码解码,网络传输。

③一个EJB可以同时具有本地业务接口和远程业务接口。

④如果有多个业务接口,可以采用@Remote({业务接口1,业务接口2})

  此时EJB在JNDI上绑定的JNDI名字为:“#”+业务接口的全限定名。

@Statful用于有状态SessionBean的标注

有状态会话Bean的标注:@Remove@PreDestory @Init

@Remove(retainIfExctption="true|false")

是否在Bean的实例抛出异常之后是否保留着个实例,@Remove标注能够应用的有状态SessionBean中的某个业务方法上。当调用到应用了这一注释的方法时,EJB容器会将这个Bean的实例销毁或是保留,

retainIfExctption属性置为true,则会在调用Bean的业务方法中出现异常则会保留这个Bean的实例,置为false则会销毁该实例。

 

EJB的依赖注入

@Resource标注能够引用到EJB组件环境中的资源。

@Resource(name="",type="")

注意在使用资源引用的时候,也需要在厂商的部署描述文件中对资源进行配置,也就是配置资源的类型和名字,以及JNDIname

 

@EJB(name="",beanInterface="",beanName="",description="")

name属性指定引用EJB组件的名字

beanInterface属性用于指定被引用的EJB组件的接口类型

beanName属性如果在要引入的EJB组件在相同模块中也就是在同一个jar文件中,就需要自定beanName了

 

EJB拦截器(Intercepters)

 

EJB拦截器,使用来截取客户的调用方法的,就像是过滤器,他只适用于SessionBeanMDB。

对目标对象方法进行调用之前,拦截器先执行调用。

@Interceptors和@AroundInvoke

使用@AroundInvoke标注注释方法,并且方法的返回值为Object

 

(1) 拦截器方法要用InvocationContext参数(Interface)

  InvocationContext的实现可以提供目标对象的相关信息。

(2) 拦截器方法需要用@AroundInvoke标注,表明为拦截器方法。

(3) 在拦截方法中用InvocationContext.proceed()来执行目标对象的方法。

(4) 拦截器方法可以定义在单独的拦截器里,也可以定义在Bean类里。外部拦截方法优先级高。

  单独的拦截器用@ Intercepters来标注属于哪个Bean里。

(5) 假设目标对象有多个拦截器,按照先后顺序执行。

public classTest{

  @AroundInvoke

        public Object test(InvocationContextinv){

              System.out.println("Intercepted call via external class to:"+

                inv.getMethod().getName());//打印客户调用的方法的名字

                Object[]params=inv.getParameters();//获得客户调用的方法的参数表

                for(inti=0;i

                   System.out.println("/tparam: "+params[i]);//打印所有参数

                }

        }

}

 

三、依赖注入(DI,Dependency Injection)

  依赖注入,由容器将资源赋值给EJB。EJB的资源依赖容器来注入,因此称为依赖注入。

  @Resource(name=“jdbc/sample”)

    private……

  资源的引用

  该引用名需要在容器特定的配置文件里配置,并指向真正的资源在JNDI的名字。

  @Resource(……)标注可以用在属性,setter方法,类之前。