在Spring的运行时动态声明bean

在Spring的运行时动态声明bean,spring,Spring,我想知道是否可能做到以下几点。出于测试目的,我希望在不同测试的应用程序上下文中声明不同的模拟类。这些是验收测试,使用Jersey REST客户端。有没有办法在运行时动态声明bean?Spring是否有允许在加载上下文后更改应用程序上下文的API?在应用程序上下文中使用不同bean的常见方法是使用概要文件。您可以在以下spring源代码帖子中阅读有关概要文件的内容: 关于第一个问题,您可以在运行时通过BeanDefinitionRegistry.registerBeanDefinition

我想知道是否可能做到以下几点。出于测试目的,我希望在不同测试的应用程序上下文中声明不同的模拟类。这些是验收测试,使用Jersey REST客户端。有没有办法在运行时动态声明bean?Spring是否有允许在加载上下文后更改应用程序上下文的API?

在应用程序上下文中使用不同bean的常见方法是使用概要文件。您可以在以下spring源代码帖子中阅读有关概要文件的内容:

关于第一个问题,您可以在运行时通过
BeanDefinitionRegistry.registerBeanDefinition()
方法声明bean,例如:

  BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(SomeClass.class);
  builder.addPropertyReference("propertyName", "someBean");  // add dependency to other bean
  builder.addPropertyValue("propertyName", someValue);      // set property value
  DefaultListableBeanFactory factory = (DefaultListableBeanFactory) context.getBeanFactory();
  factory.registerBeanDefinition("beanName", builder.getBeanDefinition());
也可以使用注册一个单例bean实例(已经配置)

最后,Spring没有提供在刷新上下文后更改bean的明确方法,但最常见的方法是:

  • 关闭并再次刷新(明显)
  • 使用代理并在运行时交换targetSource:请参阅(有关示例)
context.getBeanFactory().registerSingleton(beanName, singletonObject)