Spring 作为供应商 JNDI?

我想使用 Spring 作为供应商 JNDI. 这意味着我想在我的上下文中配置bob Spring, 访问您可以通过它完成的 JNDI. 它看起来像这样:


<bean class="org.some.thing.here">
<property name="beans">
<map>
<entry key="w/t/f">
<bean class="some.thing.Else">
// rest ommitted
</bean>
</entry>
</map>
</property>
</bean>


然后,在我的申请中 /让我们说控制器/, 我希望能够通过以下方式捕捉此鲍勃:


Context ctx = new InitialContext//;
some.thing.Else bar = /some.thing.Else/ ctx.lookup/"w/t/f"/;


我怎么能去呢? 我在看 XBean, 但是,该项目看起来过时了 /S.不起作用 Spring 3.0.X, 我不这样认为/, 文档非常小。

有其他选择吗? 我也会考虑折叠你自己的提供商课程 jndi, 如果不是太难了。

EDIT:

我必须补充一点,我没有机会使用 JNDI, 我有一个我们必须使用的库,这需要通过下载某些组件 JNDI. 我想使用 Spring 作为供应商。
已邀请:

知食

赞同来自:

为什么要使用 JNDI? 刚拿 Spring ApplicationContext 并从中获取鲍勃。

假设您初始化 Spring 通过 ContextLoaderListener 在您的Web应用程序中,您应该能够从中获取应用程序 ServletContext. 从那里你可以得到你宣布的任何鲍勃 Spring.


ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext/servletContext/;
Object bean = context.getBean/some.thing.Else.class/;


如果您需要使用 JDNI, 然后你可以创建 ServletContextListener, 这使得如下所示 contextInitialized//:


ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext/servletContext/;

Object bean = context.getBean/some.thing.Else.class/;

Context initCtx = new InitialContext//;
Context springCtx = initCtx.createSubcontext/"spring"/;

springCtx.bind/"bean", bean/;


然后你应该能找到鲍勃 Spring 在 "spring/bean" 的 InitialContext.

应该注意两件事:

上下文侦听器可能也会导致 initCtx.destroySubcontext/"spring"/ 在 contextDestroy.

空间名称 java:comp/env 只读阅读 /至少在 Tomcat/, 因此,你不能把任何东西放在那里。


促进军队:

另外一个清晰度......

如果您打算参考 Spring 鲍勃夫通过
ApplicationContext

, 你需要
ContextLoaderListener

, 在你的中定义 web.xml. 这应该在侦听器的用户类前定义...类似:


<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>
org.example.sandbox.MyCustomServletContextListener
</listener-class>
</listener>


另外,你可以得到
ServletContext

, 哪种用途
getWebApplicationContext

, 的
ServletContextEvent

, 例如:


@Override
public void contextInitialized/ServletContextEvent contextEvent/ {
try {
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext/contextEvent.getServletContext///;

// get a bean named "myCalendar" from the application context
Calendar cal = /Calendar/appContext.getBean/"myCalendar"/;

// bind via JNDI
Context initialContext = new InitialContext//;
Context subCtx = initialContext.createSubcontext/"sample"/;
subCtx.bind/"calendar", cal/;

} catch /NamingException e/ { // ommitted }
}

莫问

赞同来自:

AngerClown 权利,不要担心 JNDI, 如果您不需要提供与坚持的其他模块的链接。 如果你在容器中 webapp, 如 Tomcat, 他将有一个注册 JNDI. 用它。 如果它不在容器内 webapp, 然后在任何情况下都没有意义 JNDI, 由于它适用于媒体 J2EE.

假设您在Web应用程序中,运行应用程序的最佳方式是拥有一个主要类 Spring bean, 实现生命周期接口 /例如, InitializingBean/, 在开始申请时接听电话。 到这时,您的主应用程序类将通过其所有依赖项引入。 这避免了直接呼叫方法的需要 ApplicationContext.

但是,如果您需要引起方法 ApplicationContext 你正在跑步 Spring, 你可以实现 BeanContextAware 并获得上下文的注入。

帅驴

赞同来自:

另一种写自己的方法 JndiExporter

https://blog.konstantinpavlov. ... jndi/
/

要回复问题请先登录注册