`
yangzb
  • 浏览: 3506884 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

接口 Context

    博客分类:
  • Java
阅读更多

javax.naming
接口 Context

所有已知子接口:
DirContext , EventContext , EventDirContext , LdapContext
所有已知实现类:
InitialContext , InitialDirContext , InitialLdapContext

public interface Context

此接口表示一个命名上下文,它由一组名称到对象的绑定组成。它包含检查和更新这些绑定的一些方法。

 

名称

每个作为参数传递给 Context 方法的名称都是相对于该上下文的。空名称用于命名上下文本身。名称参数绝对不能为 null。

大多数方法具有重载形式,一种带有 Name 参数,另一种带有 String 参数。这些重载的方法是等效的:如果 NameString 参数只是相同名称的不同表示形式,则相同方法的重载形式的行为也相同。在以下方法描述中,仅完整记录一种形式。第二种形式将链接到第一种:对两者应用相同的文档。

对于支持联合的系统,Context 方法的 String 名称参数是复合名称。是 CompositeName 实例的那些名称参数被视为复合名称,而不是 CompositeName 实例的 Name 参数被视为组合名称(可能是 CompoundName 实例或组合名称的其他实现)。这允许将 NameParser.parse() 的结果用作 Context 方法的参数。在 JNDI 1.2 之前,所有名称参数都被视为复合名称。

此外,对于支持联合的系统,NamingEnumeration 中所有从 list()listBindings() 返回的名称都是表示为字符串的复合名称。有关名称的字符串语法,请参见 CompositeName

对于不支持联合的系统,名称参数(NameString 形式)和 NamingEnumeration 中返回的名称可能是其自己的名称空间中的名称,而不是复合名称空间中的名称,这由服务提供程序决定。

 

异常

此接口中的所有方法都可以抛出 NamingException 或其任意子类。有关每个异常的详细信息,请参见 NamingException 及其子类。

 

并发访问

不保证 Context 实例与多个线程的并发访问是同步的。需要并发地访问单个 Context 实例的线程应该在它们之间实现同步并提供必需的锁定。对于每个线程都操作一个不同 Context 实例的多个线程而言,无需实现同步。注意,向 lookup 方法传递空名称将返回一个表示相同命名上下文的新 Context 实例。

为了实现并发控制,返回 NamingEnumeration 的 Context 操作在枚举仍在使用中或者仍在遵从该操作生成的所有反向链接时被认为尚未完成。

 

参数

传递给 Context 接口或其子接口之一中任何方法的 Name 参数不会被服务提供程序修改。服务提供程序可以在执行操作期间保留一个对它的引用,其中包括方法结果的所有枚举和生成的所有反向链接的处理。调用方在这段时间内不能修改该对象。任何这类方法返回的 Name 都归调用方所有。调用方随后可修改它,而服务提供程序则不能。

 

环境属性

JNDI 应用程序需要一种方式来传达定义访问命名服务和目录服务的环境的各种首选项和属性。例如,为了访问服务,某个上下文可能需要安全证书的规约。另一个上下文可能要求提供服务器的配置信息。这些被称为某一上下文的环境Context 接口提供一些检索和更新此环境的方法。

该环境在上下文方法从一个上下文到下一个上下文时从父上下文中继承。对某一上下文环境的更改不会直接影响其他上下文的环境。

当将环境属性用于有效性和/或验证有效性时,这些属性与实现有关。例如,一些与安全有关的属性被服务提供程序用于“登录”目录。此登录过程可能发生在创建 上下文时,或者发生在第一次对该上下文调用方法时。无论这在何时或是否发生,此环境属性都与实现有关。在将环境属性添加到上下文中或从上下文中移除时,验 证这些更改的有效性也都与实现有关。例如,验证某些属性可能发生在进行更改时,或者发生在对上下文执行下一个操作时,抑或根本不验证。

拥有对某一上下文的引用的任何对象都可以检查该上下文的环境。敏感信息(比如明文密码)不应该存储在该环境中,除非已知实现能保护这类信息。

资源文件

要简化设置 JNDI 应用程序所需环境的任务,可以将资源文件 与应用程序组件和服务提供程序一起发布。JNDI 资源文件是使用属性文件格式的文件(参见 java.util.Properties ),包括一个键/值对列表。键是属性的名称(例如 "java.naming.factory.object"),而值是使用为该属性定义的格式的字符串。以下是 JNDI 资源文件的一个示例:

 java.naming.factory.object=com.sun.jndi.ldap.AttrsToCorba:com.wiz.from.Person
 java.naming.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person
 java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory
 

JNDI 类库读取资源文件,并使属性值随意可用。因此应该认为 JNDI 资源文件是“所有人可读的”,敏感信息(比如明文密码)不应该存储在那里。

有两种 JNDI 资源文件:提供程序应用程序

提供程序资源文件

每个服务提供程序都有一个可选的资源,该资源列出了特定于该提供程序的属性。此资源的名称是:

[prefix /]jndiprovider.properties

其中 prefix 是提供程序的上下文实现的包名称,其每个句点 (".") 都被转换成一个斜杠 ("/")。 例如,假设服务提供程序定义了一个带有类名称 com.sun.jndi.ldap.LdapCtx 的上下文实现。此提供程序的提供程序资源被命名为 com/sun/jndi/ldap/jndiprovider.properties 。如果该类不在一个包中,则资源的名称就是 jndiprovider.properties

JNDI 类库中的某些方法使用指定 JNDI 工厂列表的标准 JNDI 属性:

  • java.naming.factory.object
  • java.naming.factory.state
  • java.naming.factory.control
  • java.naming.factory.url.pkgs

在确定这些属性的值时,JNDI 库将参考提供程序资源文件。这以外的属性可由服务提供程序在提供程序资源文件中设置。服务提供程序的文档应该明确声明哪些属性是被允许的;文件中的其他属性将被忽略。

应用程序资源文件

在部署应用程序时,该应用程序通常将在其类路径中生成若干代码基目录和 JAR。类似地,在部署 applet 时,它将有一个指定 applet 类所处地址的代码基和档案文件。JNDI 查找(使用 ClassLoader.getResources() )类路径中所有名为 jndi.properties应用程序资源文件 。此外,如果文件 java.home /lib/jndi.properties 存在并且是可读的,则 JNDI 会将其视为一个额外的应用程序资源文件。(java.home 指示由 java.home 系统属性命名的目录。)包含在这些文件中的所有属性都被放置在初始上下文环境中。然后此环境由其他上下文继承。

对于同时出现在多个应用程序资源文件中的每个属性,JNDI 使用最先找到的值,或者在少数有意义的情况下串联所有这些值(细节在下文给出)。例如,如果在三个 jndi.properties 资源文件中存在 "java.naming.factory.object" 属性,则对象工厂列表是所有三个文件中的属性值的串联。使用此方案,每个可部署组件都要负责列出它导出的工厂。JNDI 在搜索工厂类时自动收集和使用所有这些导出列表。

从 Java 2 Platform 开始可使用应用程序资源文件,java.home /lib 中的文件除外,它在较早的 Java 平台上也可以使用。

属性的搜索算法

当 JNDI 构造一个初始上下文时,该上下文的环境是使用传递给构造方法的环境参数中定义的属性、系统属性、applet 参数和应用程序资源文件进行初始化的。有关细节请参见 InitialContext 。然后此初始环境由其他上下文实例继承。

如果 JNDI 类库需要确定某一属性的值,它将通过按顺序合并取自以下两个源的值来实现这一点:

  1. 将在其上执行操作的上下文的环境。
  2. 将在其上执行操作的上下文的提供程序资源文件 (jndiprovider.properties )。

对于每个同时存在于这两个源中的属性,JNDI 用以下方式确定属性的值。如果该属性是指定 JNDI 工厂列表的标准 JNDI 属性之一(如上文 所列),则这些值被串联成一个以冒号分隔的列表。对于其他属性,只使用最先找到的值。

当服务提供程序需要确定某一属性的值时,它通常将直接从环境中获取该值。服务提供程序可以定义将置于其本身提供程序资源文件中的特定于提供程序的属性。在这种情况下,它应该根据上文所述合并这些值。

这样,每个服务提供程序开发人员便可以指定与该服务提供程序一起使用的工厂列表。这可以由应用程序或 applet 的部署方指定的应用程序资源修改,而这些资源又可以由用户修改。

 

 

从以下版本开始:
1.3
分享到:
评论

相关推荐

    通过反射获取Context实例的Demo

    在Android开发中,Context是应用程序的核心组件之一,它提供了与Android系统交互的接口,包括启动Activity、发送广播、访问资源等操作。当我们需要在非Activity或非Service类中使用Context时,可以通过各种方式获取...

    反射获取Context的实例

    在Android开发中,反射是一种强大的编程技术,它允许我们在运行时检查和操作类、接口、字段和方法。本文将深入探讨如何通过反射获取`Context`的实例,并展示如何利用反射实现一个集成`Toast`的工具类。这在某些场景...

    GoLang之使用Context控制请求超时的实现

    `context` 类型是一个接口,它定义了几个方法来控制请求的生命周期,包括超时和取消。 - **创建 Context**:通常,可以通过 `context.Background()` 或 `context.TODO()` 来创建初始的上下文。前者表示没有父上下文...

    android demo,BaseAdapter传递context的应用

    `Context`在Android开发中扮演着核心角色,它是应用程序运行时环境的抽象表示,提供了与系统服务交互的接口。在`BaseAdapter`中,`Context`主要用于以下几个方面: 1. **视图创建**:在`getView()`方法中,我们需要...

    通过反射拿到Context Demo

    反射是Java提供的一种强大的机制,允许程序在运行时检查类、接口、字段和方法的信息,并能动态调用对象的方法或访问其属性。在Android中,我们可以利用反射来获取并操作类的私有成员,包括私有的Context实例。 以下...

    spring-context源码

    Spring框架是Java企业级应用开发的基石,而`spring-context`模块则是Spring框架的核心部分,它提供了上下文(ApplicationContext)接口,为bean的创建、配置、管理以及与其他服务的集成提供了全面支持。本文将深入...

    context 在ADROID中的作用

    在Android开发中,`Context`是一个至关重要的概念,它提供了应用程序运行环境的接口,是连接应用程序组件和系统服务的关键。`Context`字面上可以理解为上下文,它封装了应用程序运行时所需的各种环境信息,包括应用...

    在项目的任何地方轻松获取Context的demo

    在Android开发中,Context是应用程序的核心组件之一,它提供了与Android系统交互的接口,使得开发者可以在应用程序的不同组件之间共享状态信息。"在项目的任何地方轻松获取Context的demo"旨在展示如何高效、安全地在...

    spring-context-4.2.xsd.zip

    Spring Context模块是Spring框架的核心部分,它提供了一个统一的接口来管理应用对象,包括bean的创建、初始化、配置和查找。Context模块使得应用程序可以跨越不同层次和组件,实现松耦合和高可测试性。在Spring中,...

    Android Context与GetApplicationContext的区别及使用1

    Context可以理解为应用运行时的上下文环境,提供了对系统资源和组件的访问接口。本文将深入探讨Context的基本概念,以及在实际开发中常见的误解——ApplicationContext,并讨论Context的正确使用方式,特别是防止...

    百分百解决 springcloud项目添加context-path,调用方404问题

    当A微服务调用B微服务(B 重定向了server.servlet.context-path),那么A调用B失败,网上大部分是@FeignClient 添加path方案 缺点:耦合高,难以维护 进行整改 B添加配置文件 spring: cloud: nacos: discovery: ...

    javax.enterprise.context.jar

    在Java企业级应用开发中,`javax.enterprise.context.jar`是一个非常关键的库,它包含了用于管理组件生命周期的Contexts and Dependency Injection (CDI) API。CDI是Java EE平台的一个重要部分,它提供了依赖注入...

    012_android 之消息提示toast 和Context

    Context是Android系统中所有组件和资源的基础,它提供了与系统服务、应用程序环境和资源管理的接口。几乎所有的Android类都依赖于Context,它包含了应用程序运行所需的各种上下文信息,如应用程序资源、包管理器、...

    android中Context深入详解

    第一:Activity 继承自 Context,同时 Activity 还实现了其他的接口,我们可以这样看,Activity 在语法上 extends 了 Context,其本质上是一个 Context,但同时它实现了许多接口,扩充了 Context 的功能,扩充之后的...

    spring-context-support源码

    1. **邮件服务**:`spring-context-support`中的`JavaMailSender`接口及其实现类,如`SimpleMailMessage`,为发送电子邮件提供了便捷的API。通过配置邮件服务器的相关参数,可以在Spring上下文中轻松发送邮件。 2. ...

    spring-context-support-4.2.2和quartz-2.2.3所需Jar包

    4. **JMS支持**:Spring的JMS模块简化了消息生产者和消费者的编程模型,提供了模板和监听器接口。 接下来,我们来看看Quartz 2.2.3。Quartz是一个开源的作业调度框架,用于创建、调度和执行作业。在Java应用中,...

    spring-context-support-4.2.2.RELEASE.jar 的jar包

    2. **邮件服务支持**: 该模块还提供了对JavaMailSender接口的实现,使得发送电子邮件变得简单。只需配置好邮件服务器的相关参数,就可以在Spring应用中方便地发送文本、HTML甚至带有附件的邮件,极大地简化了邮件...

    java实现读取证书访问https接口

    3. 将`TrustManagerFactory`的实例设置到`SSLContext`中,然后通过`sslContext.init(null, trustManagerFactory.getTrustManagers(), null)`初始化SSLContext。 4. 创建`SSLSocketFactory`实例,这是通过调用`ssl...

    利用Spring Context上下文创建自定义对象

    在Spring应用中,Context通常通过`ApplicationContext`接口来实例化,如`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`,这些类用于加载XML配置文件并初始化bean。 创建自定义对象的基本...

Global site tag (gtag.js) - Google Analytics