• jndi的疑惑 转


    有关InitialContext()的困惑

    Context initial = new InitialContext();
    Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter");    

    一般情况下,intial.lookup("")中的参数就是你的JNDI名称。但是用的应用服务器,是把JNDI名放到java:comp/env/ejb/后面的。两种方式都没有错。比如:
    TomCat5.0中使用的是Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter"); WebLogic6.1中使用的是:
    Object objref = initial.lookup("HelloHome");

    InitialContext的构造方法主要是准备JNDI的访问环境,如果不加参数,那就意味着是用本地匿名访问,也就是说,用户角色是匿名,ctx.PROVIDER_URL是LOCALHOST
    所以,对于本地测试(并且JNDI资源没有设置安全属性)这两段代码没有区别,如果要访问远程的JNDI资源,就必须用饱含JNDI环境参数Hashtable初始化InitialContext。

    必要的环境参数如:
    Context.INITIAL_CONTEXT_FACTORY//连接工厂
    Context.PROVIDER_URL//访问连接
    Context.SECURITY_PRINCIPAL//安全用户
    Context.SECURITY_CREDENTIALS//用户密码 

    EJBLocalHome->本地主接口,负责控制Bean的整个生命周期,另外,可以看作是
    生成Bean引用的
    “工厂“类。  

    EJBLocalObject->本地组件接口,定义Bean要向客户提供的业务方法的签名。

    本地接口是一种轻量级代理,语法更简单(直接类型转换,不需要narrow),

    开销更小,速度更快。规范说可以在同一JVM内使用,我只在同一个EJB包内用过。
    EJBLocalHome+EJBLocalObject   vs   EJBHome+EJBObject:   
      前一对不是远程调用,省时省力    
    Home   vs   Object:   
      前者是Factory模式,用来生成后者;后者是proxy模式,用来暴露商业逻辑

    InitialContext context = new InitialContext();           
    Object ref = context.lookup(JNDIname);           
    accHome = (AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class);       
    ejbObject = accHome.create();   
      上面即是ejb实例的一个很常见的创建过程   
    理解如下:   
       上面的创建过程是通过远程接口创建ejb实例的过程:即先通过JNDIname找到ejb本地接
    口的一个实例,然后再通过本地接口的实例创建ejb实例,PortableRemoteObject.narrow(ref,AccountHome.class);
    实际上是一个强制转换,由于是远程强制转换,所以要用PortableRemoteObject.narrow()方法。


    // 创建一个JNDI naming contest
               Context initial = new InitialContext();
               
               // 从JNDI 中以MyConverter 名子来定位到对象(在发布名称指定了JNDI名称)
    //         Object objref = initial.lookup("java:comp/env/ejb/ConverterEJB");
               Object objref = initial.lookup("MyConverter");
               
               // 通过objref 得到ConverterHome 本地接口
               ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(
                       objref, ConverterHome.class);
               
               // 再由Home 接口的create 方法来创建一个服务器上的EJB实例
               Converter currencyConverter = home.create();
               
               // 调用EJB 中的方法
               代码省略

  • 相关阅读:
    前后端交互中出现的问题(五)
    前后端交互中出现的问题(四)
    前后端交互中出现的问题(三)
    生成ssh密码并且添加到git远程仓库
    快捷键
    阿里一面
    B树,B+树的插入删除操作
    乐观锁与悲观锁
    并发编程中的Callable,Future,FitureTask
    java并发包下的lock接口与syschronized关键字的区别
  • 原文地址:https://www.cnblogs.com/javahuang/p/3048258.html
Copyright © 2020-2023  润新知