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

时间:2013-11-28 08:45:45

标签: java spring

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

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

    ClassPathXmlApplicationContext context =     新的ClassPathXmlApplicationContext(“/ myConfig.xml”);

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

2 个答案:

答案 0 :(得分:0)

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

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);
        }

请注意,类路径:在独立程序的情况下重新加入/ src目录(而对于webapp是你的docroot)。

您可以拥有所需的应用程序上下文数量,并且可以配置spring以在web.xml(或Main.class)中加载所需的内容

答案 1 :(得分:0)

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

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(“/ myConfig.xml”);

是的,但要确保你只做一个。

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

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

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

Spring配置

<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");