java:comp/env /做什么?

Dan*_*nny 114 spring factory jndi jdbc

我花了太多时间在连接一些JNDI工厂bean时试图找出一些错误.结果问题是,而不是......

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

我其实写了这个......

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

我推断java:comp/env /可能引用了一些环境变量,并最终使我的上下文文件被查看.唯一的区别是java:comp/env /.从专家的口中,这是做什么的?

如果没有值中的java:comp/env前缀,我将收到一条错误,指出"Name jdbc未绑定在此Context中".

che*_*vim 98

引用https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

在命名空间的根上下文中是名称为"comp"的绑定,该绑定绑定到为与组件相关的绑定保留的子树.名称"comp"是组件的缩写.根上下文中没有其他绑定.但是,根上下文保留用于将来扩展策略,特别是用于命名不与组件本身相关但与其他类型的实体(如用户或部门)相关的资源.例如,未来的策略可能允许您使用"java:user/alice"和"java:org/engineering"等名称来命名用户和组织/部门.

在"comp"上下文中,有两个绑定:"env"和"UserTransaction".名称"env"绑定到为组件的环境相关绑定保留的子树,由其部署描述符定义."env"是环境的缩写.J2EE建议(但不要求)"env"命名空间的以下结构.

因此,您在spring中执行的绑定,例如,来自tomcat上下文描述符的绑定默认情况下在java:comp/env /下

例如,如果您的配置是:

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="foo"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下方式直接访问它

Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/foo");
Run Code Online (Sandbox Code Playgroud)

或者你可以做一个中间步骤,这样你就不必为你检索的每个资源都指定"java:comp/env":

Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");
Run Code Online (Sandbox Code Playgroud)

  • 使用"foo"绑定并使用"java:comp/env/foo"进行查找.看看http://blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi/ (4认同)
  • 以上链接来自独立的JNDI教程,最初可在以下网址获得:http://docs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html. (3认同)

Fil*_*nov 36

还有一个属性resourceRefJndiObjectFactoryBean,则设置为当true用于自动在前面加上字符串,java:comp/env/如果它不存在.

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
  <property name="resourceRef" value="true"/>
</bean>
Run Code Online (Sandbox Code Playgroud)