我有一个基于Spring的webapp,我也有一个后台进程。从后台进程中,我希望能够访问spring bean。我通常使用以下方法检索spring bean:
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
Object mySpringBean = context.getBean("mySpringBean");
问题是我的后台进程不是基于servlet的,并且无法访问servletContext。后台进程由专有任务执行程序触发。此任务执行程序使用Class.forName来实例化我的后台进程,我不允许修改任务执行程序。
我的后台进程是否可以访问spring bean?如果是这样,怎么样?
答案 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);