在没有servlet / webapp上下文的情况下访问Spring Bean

时间:2012-01-25 14:45:28

标签: java spring web-applications

我有一个基于Spring的webapp,我也有一个后台进程。从后台进程中,我希望能够访问spring bean。我通常使用以下方法检索spring bean:

ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
Object mySpringBean = context.getBean("mySpringBean");

问题是我的后台进程不是基于servlet的,并且无法访问servletContext。后台进程由专有任务执行程序触发。此任务执行程序使用Class.forName来实例化我的后台进程,我不允许修改任务执行程序。

我的后台进程是否可以访问spring bean?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:4)

首先,我的解决方案并不理想。在使用它之前,请考虑应用程序的体系结构,您可以进行结构更改以访问上下文。

如果你有多个正在维护的上下文,你显然需要在这里添加一些逻辑来对它们进行排序。

您可以创建ApplicationContextAware bean,并通过静态访问您的上下文:

@Component
public class SpringApplicationContext implements ApplicationContextAware {

    private static ApplicationContext CONTEXT;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        CONTEXT = applicationContext;
    }

    public static <T> T getBean(Class<? extends T> beanClass) {
        return CONTEXT.getBean(beanClass);
    }

    protected static ApplicationContext getContext() {
        return SpringApplicationContext.CONTEXT;
    }
}

另一种选择是,如果您有办法在后台进程中注册上下文,则可以在setApplicationContext方法中执行此操作。

答案 1 :(得分:3)

尝试使用org.springframework.context.support.ClassPathXmlApplicationContext加载Spring上下文:

ApplicationContext context = new ClassPathXmlApplicationContext("/path/to/applicationContext.xml");

答案 2 :(得分:1)

这个怎么样?`

ApplicationContext context = new ClassPathXmlApplicationContext("/spring-activemq/spring-activemq-producer-nio.xml");

您所要做的就是指定XML的位置

答案 3 :(得分:0)

您的后台进程必须手动创建上下文。通常,这在进程初始化期间完成一次。

类似的东西:

ApplicationContext context = new ClassPathXmlApplicationContext(new String [] {“appContext.xml”},true);