如何在独立的 Java 程序中获取我的 Web 应用程序中的 Spring Application 上下文

Posted

技术标签:

【中文标题】如何在独立的 Java 程序中获取我的 Web 应用程序中的 Spring Application 上下文【英文标题】:How to get hold of Spring Application context in my web app in a Stand alone java program 【发布时间】:2013-11-28 08:45:45 【问题描述】:

我已经有一个 webapp,它在 web.xml 中定义了 Spring 应用程序上下文。此外,我在同一个项目中有一个独立程序,它调用 Web 服务并获取产品列表并将这些值插入表中。这个独立程序就像一个在特定时间执行的调度程序。 我的疑惑如下。

    我可以在我的独立程序中创建一个应用程序上下文,如下所示

    ClassPathXmlApplicationContext 上下文 = new ClassPathXmlApplicationContext("/myConfig.xml");

    如何在我的 Web 应用程序中获取已加载的应用程序上下文。 我们可以在同一个项目中创建多个应用程序上下文

【问题讨论】:

【参考方案1】:

1.我可以在我的独立程序中创建一个应用程序上下文,如下所示

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/myConfig.xml");

是的,但请确保您只做一次。

2.我们可以在同一个项目中创建多个应用程序上下文

是的,但这不是一个好习惯。因此,只需为您的独立程序创建一次 ApplicationContext(可能是您的 Web 应用程序)并调用 ApplicationContextProvider 以获取现有的 ApplicationContext

下面给出了创建ApplicationContextProvider的示例代码和解释。

弹簧配置

<bean id="applicationContextProvider" class="dell.harmony.service.ApplicationContextProvider"></bean> 

这将被spring容器调用,当它第一次创建一个applicationcontext并且applicationContext将被传递给setter方法(setApplicationContext)。我们通过 getApplicationContext() 公开应用程序上下文,以便其他方法可以使用它。

package dell.harmony.service;

import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;


/*
 * 
 * Utility Class to return the Spring ApplicationContext
 * 
 * 
 */
public class ApplicationContextProvider implements ApplicationContextAware 

    private static Logger logger = Logger.getLogger(ApplicationContextProvider.class);

    private static ApplicationContext ctx;

    @Override
    public void setApplicationContext(ApplicationContext arg0)
            throws BeansException 
        if (arg0 != null) 
            ctx=arg0;
        
    

    public synchronized static ApplicationContext getApplicationContext()
        if (ctx==null) 
            logger.info("Getting the context again as it is null");
            ctx = new ClassPathXmlApplicationContext("SpringModule.xml");
        
        return ctx;
    


当您需要应用程序上下文时,请按如下方式使用它

第一次初始化调度器。

logger.info("Spring Application Context !!");
ApplicationContext context = new ClassPathXmlApplicationContext("/SpringModule.xml");
logger.info("Spring Application Context - End !!");

在所有其他地方,使用如下:

ApplicationContext context = ApplicationContextProvider.getApplicationContext(); 
SingleDataLoader dl = (SingleDataLoader) context.getBean("singledataloaderdao");

【讨论】:

无需进行查找,只需将 ApplicationContext 注入您需要的位置。添加一个字段并使用@Autowired`@Inject`@Resource 之一进行注释。无需提供程序,也无需通过查找使您的代码杂乱无章。 同意,使用注解注入 applcationcontext 是个好主意。 @M. Deinum 根据这​​个线程,使用注释不是一个好主意,我很困惑 :)***.com/questions/9657961/… 实际上两者都很糟糕,正如该线程中提到的那样。一般来说,您不应该直接访问ApplicationContext。一旦你开始需要它(除了基础设施代码),你应该退后几步重新考虑设计。【参考方案2】:

正如你所说,你可以通过加载文件来创建你的上下文

ApplicationContext context = null;
        try 
            context = new ClassPathXmlApplicationContext("classpath:config"+System.getProperty("file.separator")+"applicationContext.xml");
 catch (Throwable e)
            logger.warn(e.getMessage());
            logger.trace(e.getMessage(), e);
        

请注意 classpath: 在独立程序的情况下引用您的 /src 目录(而对于 webapp 是您的 docroot)。

你可以有多少你想要的应用程序上下文,你可以配置 spring 以在你的 web.xml(或你的 Main.class)中加载你需要的 wwitch

【讨论】:

以上是关于如何在独立的 Java 程序中获取我的 Web 应用程序中的 Spring Application 上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何在Linux中独立执行Java程序?

如何在同一个域中托管我的 API 和 Web 应用程序?

Java web项目,在.java程序中如何获取webapp路径?

如何使用 Google API 通过独立的 Java 类获取 IP 地址的位置?

jsp 在java程序中获取 web-inf目录

如何访问 weblogic 10.3.6 中定义的 JNDI 数据源