Java 在没有servlet/webapp上下文的情况下访问Springbean

Java 在没有servlet/webapp上下文的情况下访问Springbean,java,spring,web-applications,Java,Spring,Web Applications,我有一个基于spring的webapp,还有一个后台进程。在后台进程中,我希望能够访问SpringBeans。我通常使用以下方法检索SpringBean: ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); Object mySpringBean = context.getBean("mySpringBean"); 问题是我的后台进程不是基于

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

ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
Object mySpringBean = context.getBean("mySpringBean");
问题是我的后台进程不是基于servlet的,并且没有访问servlet上下文的权限。后台进程由专有任务执行程序触发。此任务执行程序使用Class.forName来实例化我的后台进程,不允许我修改任务执行程序


我的后台进程可以访问SpringBeans吗?如果是,如何创建?

您的后台进程必须手动创建上下文。通常在流程初始化期间执行一次

比如:

ApplicationContext context=new ClassPathXmlApplicationContext(新字符串[]{“appContext.xml”},true)

这个怎么样`

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

您只需指定XML的位置

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

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

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

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

您可以创建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;
    }
}
@组件
公共类SpringApplicationContext实现ApplicationContextAware{
私有静态应用上下文上下文;
@凌驾
public void setApplicationContext(ApplicationContext ApplicationContext)抛出BeansException{
上下文=应用上下文;
}

公共静态T getBean(类这会导致Spring为我的xml文件中的每个bean实例化一个额外的实例吗?或者它会访问由webapp创建的Spring上下文吗?或者,我可以创建一个单独的xml文件,只列出我的后台进程所需的bean。这样会更好吗?David,后者会更好。这意味着更多随着时间的推移,你的Bean会改变不同的上下文文件,但这是值得的。它将创建一个全新的Spring上下文,与webapp创建的上下文没有任何链接。我真的认为会有两个单独的上下文,一个是你的后台进程,一个是webapp。我同意其他评论。这不是一个好的answer,它将创建一个新的上下文。好的,但是这些bean与servlet使用的bean不同。后台进程将有自己的spring上下文并重新创建这些bean。这种方法最适合我的情况,谢谢!