企业bean 的环境是一种机制,这种机制可以在部署或组装时客户化企业bean 的业务逻辑。企业bean 的环境可以在不需要获取或改变企业bean 源代码的情况下客户化企业bean。
注释符和部署文件是应用组装者和部署者获取客户化业务逻辑信息和获取外部信息的主要途径。
容器实现企业bean 的环境,并将它作为JNDI 命名上下文。企业bean的环境可按下述方式来使用:
企业bean 使用来自环境的条目。来自环境的条目被容器注入到企业bean的字段或方法,或者bean 的方法可以使用EJBContext lookup 方法或JNDI 接口来访问环境。Bean 提供者用java 语言元数据注释符或部署文件来声明企业bean 希望在运行时得到的环境条目。
容器提供存储企业bean 环境的JNDI 命名上下文的实现。容器也提供让部署者创建和管理每个企业bean 环境的工具。
部署者使用容器提供的工具创建和初始化环境条目,这些条目通过企业bean 的注释符或部署文件来声明。部署者可以设置和改变环境条目的值。
容器按照bean 的元数据注释符或部署文件的指定将来自环境的条目注入到企业bean 的字段或方法。
容器可以让企业bean 实例在运行时获取这些环境命名上下文。企业bean实例可以使用EJBContext 的lookup 方法或JNDI 接口来得到环境条目的值。
容器也必须让企业bean 的任何拦截器类和JAX-WS 消息处理器可以获得企业bean 的环境。拦截器和web 服务处理器类共享bean 的环境。
共享环境条目
每个企业bean 都定义了它自己的环境条目集。企业bean 的所有实例都共享
这些环境条目;这些环境条目不被其他企业bean 共享。企业bean 实例不允许在运行时更改bean 的环境。
兼容性提示:如果企业bean 由EJB2.1 API 规范实现,且在容器内被部署多次,那么每次部署都会创建不同的home。部署者可以为每个home 设置不同的企业bean 环境条目的值。
一般情况下,查找JNDI 的java:命名空间中的对象要求每次都返回被请求对象的一个新实例。以下情况除外:
容器知道对象是不变的(例如,对象类型是java.lang.String),或者知道应用不能改变对象的状态。
对象定义成单例的,这样只有一个对象实例可以存在于JVM 中。
用于查找的名字返回的是可能会被共享的对象的实例。java:comp/ORB就是这样的名字。
在这些情况下,返回对象的共享实例。在其他的情况下,必须返回被请求对象的新实例。注意: 对于资源适配器连接对象, 返回对象是适配器的ManagedConnectionFactory 实现。
对象的每次注入都与会进行JNDI 查找。根据上述的规则来决定是注入被请求对象的新实例还是注入共享实例。
术语警告:企业bean 的“环境”不应当和JNDI 文档中定义的“环境属性”混淆。
注释使用环境条目
Bean 类的字段或方法都可以被注释请求注入一个bean 环境的条目。在本章中描述的所有类型的资源或其他环境条目都可以被注入。也可以在部署文件中要求注入这些资源类型。字段或方法可以是各种访问控制符(public,private 等),但不能是static。
Bean 类的字段可以是注入的目标。字段不能是final。缺省情况下,字段的名字和类的名字组合在一起直接作为bean 命名上下文的名字。例如,在包com.acme.example 中的类MySessionBean 的字段myDatabase对应于JNDI 的名字是java:comp/env/com.acme.example.MySession-Bean/myDatabase。注释也允许显式指定JNDI 的名字。
环境条目也可以通过遵循JavaBean 属性命名规则的bean 方法被注入到bean 上。这个注释符应用到属性的set 方法,调用set 方法来注入环境条目。JavaBean 的属性名(不是方法名)用作缺省的JNDI 名。例如,类MySessionBean 的方法名为setMyDatabase 对应的JNDI 名为java:comp/env/com.example.MySessionBean/myDatabase。
是使用部署文件条目来指定注入时,JNDI 名和实例变量名或属性名都要显式地被指定。注意JNDI 名总是相对于java:comp/env 命名上下文。
每个资源都可以被注入到bean 的单个字段或方法。请求将资源java:comp/env/com.example.MySessionBean/myDatabase 既注入到setMyDatabase方法又注入到myDatabase 实例变量是错误的。但是注意,这个字段或方法可以请求注入不同名字(非缺省名字)的资源。通过显式指定资源的JNDI 名字,单个资源可以被注入到多个类的多个字段或多个方法。
注释符也可以应用到bean 类本身。这些注释符声明了bean 环境中的条目,
但不会造成资源被注入。反而,期望bean 使用EJBContext 的lookup 方法或JNDI API 的方法来查找条目。当注释符被应用到bean 类时,必须显式指定JNDI 名和环境条目类型。
注释符可以出现在bean 类或它的任何父类上。在继承层级中任意类上的资源注释符都定义了bean 需要的资源。但是这样的资源注入遵循java 语言中字段和方法的重载规则。重载父类方法的方法如果定义了资源,则将资源注入到该方法。重载方法可以请求与父类方法不同的资源,或它可以请求不要注入(尽管父类方法请求注入)。
另外,不可见或被子类隐藏的(与重载相反)字段或方法仍然可以请求注入。
例如,这可以让私有字段作为注入的目标,且这个字段用于父类的实现,尽管子类不可见这个字段且不知道父类实现如何使用注入的资源。注意,在子类中声明和父类同名的字段总是会造成父类字段的隐藏。
注释符和部署描述
环境条目可以通过注释符被声明而不需要部署描述条目。环境条目也可以通
过部署描述条目被声明而不需要任何注释符。同一个环境条目既可以同时使用注释符和部署描述条目来声明。在这种情况下,在部署描述条目中的信息用于覆盖注释符提供的信息。这可以被应用组装者用于覆盖由Bean 提供者提供的信息。
部署描述条目不应当用于请求向不作注入的字段或方法注入资源。
下面的规则应用于部署描述条目如何覆盖Resource 注释符:
相关的部署描述条目基于与注释符一起使用的JNDI 名来定位(缺省的或显式提供的)。
在部署描述中指定的类型必须是对应于字段或属性的类型,或在Resource 注释符中指定的类型。
如果指定了部署描述,那么描述覆盖注释符中的描述元素。
如果指定了注入目标,那么这个目标必须和被注释的字段或属性方法的名字一致。
如果指定了res-sharing-scope,那么覆盖注释符的shareable 元素。一般情况下,应用组装者或部署者从来不应当改变元素的值,如果这样做很可能中断应用。
对覆盖环境条目值得限制依赖于环境条目的类型。
分享到:
相关推荐
1. 创建初始上下文(Initial Context):这是访问JNDI服务的第一步,需要提供适当的环境属性来配置命名服务。 2. 执行查找操作:使用`Context.lookup()`方法,传递要查找的名字。 3. 处理查找结果:查找的结果可能是...
1. `fscontext.jar`:这是一个提供文件系统上下文(FileSystemContext)的JAR文件,它使得JNDI能够与本地文件系统进行交互。通过这个库,开发者可以使用JNDI接口来查找和操作文件系统中的资源,就像处理远程对象一样...
1. **JNDI基础:** JNDI的核心概念包括名称上下文(Name Context)、查找(Lookup)和绑定(Bind)。名称上下文提供了一种组织命名对象的方式,查找是通过名称找到对象,绑定则是将名称与对象关联起来。JNDI支持多种...
1. **初始化Naming Context**:首先,你需要创建一个初始上下文(InitialContext),这是所有JNDI操作的起点。这通常通过传递一个配置环境属性的Map来完成,这些属性可能包含服务器URL、用户名、密码等。 ```java ...
每个JNDI环境都有一个初始上下文,它是根上下文,用于查找其他上下文和命名对象。 - **初始上下文**:这是进入JNDI名称空间的第一个入口点。通过创建`InitialContext`对象,开发者可以开始查找EJB组件。 - **子上...
- 为了测试JNDI配置是否正确,你可以尝试从Spring应用上下文中获取数据源并打印其信息,确保能成功查找并实例化。 6. **扩展性与最佳实践**: - 考虑使用Spring Boot,它提供了更简洁的方式来配置JNDI数据源,只...
3. **查找EJB3**:客户端代码使用Java的`InitialContext`类来初始化JNDI上下文,并通过`lookup()`方法查找指定JNDI名称的EJB3组件。 4. **获取引用**:查找成功后,客户端将获得一个bean的引用,通常是代理对象。这...
`InitialContext`是`Context`的一个实现,常用于初始化上下文。`NamingEnumeration`用于遍历查找结果。例如,通过设置环境属性`Context.INITIAL_CONTEXT_FACTORY`来指定命名服务的提供商,然后使用`InitialContext`...
2. **Spring配置**:在Spring的配置文件中,我们需要声明一个`jee:lookup`元素来从JNDI上下文中查找数据源。下面是一个示例: ```xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee=...
- **初始化JNDI上下文**:创建`InitialContext`对象,这是所有JNDI操作的起点。通常需要设置一些环境属性,如`java.naming.factory.initial`和`java.naming.provider.url`,以指定命名和目录服务的实现。 - **查找...
通过初始化一个上下文,然后调用`lookup`方法,传入EJB的JNDI名称,就可以获取到SessionBean的远程接口,进一步调用其业务方法。 - **松耦合的远程对象访问**:JNDI允许以松耦合的方式绑定和获取远程对象。通过配置...
了解了JNDI的基本概念后,实际的编程中,开发者通常会使用`InitialContext`类来初始化JNDI上下文,并通过`lookup`方法查找服务。例如: ```java Properties jndiProps = new Properties(); jndiProps.put(Context....
2. **Tomcat的Context上下文**:在Tomcat中,每个Web应用都有一个Context,这是JNDI树的一个分支,用于存储该应用的特定资源。例如,可以通过JNDI查找在`/WEB-INF/classes/META-INF/context.xml`中定义的数据源。 3...
JNDI名称通常以“ejb:/”开头,后跟服务器上下文、bean的模块名、bean的接口名和bean的实例名。 在EJB中,JNDI查找通常由容器自动处理,但有时开发者需要直接使用JNDI来查找特定的EJB。例如,当客户端想要远程调用...
- WebLogic使用`WLInitialContextFactory`作为初始化上下文工厂。 - `t3://127.0.0.1:7001`通过T3协议连接到本地主机的7001端口。 ##### 3. J2EESDK(J2EERI) - **`Context.INITIAL_CONTEXT_FACTORY`**: `...
2. **配置客户端**:设置JNDI命名上下文等环境变量。 3. **部署测试程序**:确保客户端能够与部署在应用服务器上的无状态会话Bean进行交互。 **运行测试程序** 1. **启动应用服务器**:确保应用服务器运行并加载了...
在Java代码中,我们通常使用`InitialContext`类来创建一个初始上下文,这是所有JNDI操作的起点。例如: ```java Context initialContext = new InitialContext(); ``` 2. **绑定对象**: 我们可以将对象绑定...
这个名称通常由两部分组成:全局上下文名(如"java:global/")和EJB的完整类名或别名。 3. **EJB部署描述符**:在ejb-jar.xml或META-INF/ejb-jar.xml文件中,开发者需要定义EJB的元数据,包括JNDI名称、接口、实现...
// 创建JNDI上下文 Context ctx = new InitialContext(); // 查找数据源 DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/FIN_DS"); // 获取数据库连接 Connection conn = ds.getConnection(); ...