【发布时间】:2018-01-25 06:00:47
【问题描述】:
我们使用的是 4.2.x 版本的 spring,我们正在使用 ContextSingletonBeanFactoryLocator 来加载 bean,如下所示
BeanFactoryLocator bfLocator = ContextSingletonBeanFactoryLocator.getInstance("classpath:customBeanRefFactory.xml");
BeanFactoryReference ref = bfLocator.useBeanFactory("sharedApplicationContext");
BeanFactory beanFactory = ref.getFactory();
((AbstractApplicationContext) beanFactory).getBeanFactory().setBeanClassLoader(CustomSpringBeanFactory.class.getClassLoader());
return (ApplicationContext) beanFactory
我们计划升级到 spring 5.0.x 并发现 ContextSingletonBeanFactoryLocator 以及 BeanFactoryLocator 和 BeanFactoryReference 等类从 spring 5.0 版本中删除。
那么获得应用程序上下文的建议替代方法是什么?
@Configuration
@ImportResource("classpath:ourxml")
public class OurApplicationConfiguration {
}
public class OurAppicationFactoryProvider {
ApplicationContext context;
public ApplicationContext getApplicationContext() {
if (context == null) {
synchronized (this) {
if (context == null) {
context = new AnnotationConfigApplicationContext(OurApplicationConfiguration.class);
}
}
}
return context;
}
}
这是正确的方法还是有其他选择?
【问题讨论】:
-
基本上你得到
ApplicationContext的事实已经是一个缺陷,在应用程序中你不应该需要它(假设Spring正在创建上下文)。您的“解决方案”使情况变得更糟,因为这将加载两次上下文(假设 Spring 也在实例化上下文)。 -
我们很少有没有被spring注解的遗留bean。所以我们使用应用程序上下文来获取它们
-
遗留 bean 没有注释但通过上下文获取它们?如果您可以通过上下文获取它们,则可以将它们注入...如果您唯一的任务是您可以将
@AutowireApplicationContext放入您的OurAppicationFactoryProvider。不要创建一个新的(在最坏的情况下,您还会遇到类加载器问题并且您多次加载应用程序)。 -
我会试试的。
标签: spring spring-bean