Динамически объявлять beans во время выполнения в Spring

Мне интересно, возможно ли следующее. Для целей тестирования я хочу, чтобы разные классы-макеты были объявлены в контексте приложения для разных тестов. Это приемочные тесты с использованием клиента Джерси REST. Есть ли способ динамически объявить bean во время выполнения? Имеет ли Spring API, позволяющий изменять контекст приложения после загрузки контекста?

Ответы

Ответ 1

Общим способом использования разных beans в контексте приложения является использование профилей. Вы можете прочитать о профилях в следующих spring источниках сообщений:

О вашем первом вопросе вы можете объявить beans во время выполнения с помощью метода BeanDefinitionRegistry.registerBeanDefinition(), например:

  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 (уже настроенный) с помощью

context.getBeanFactory().registerSingleton(beanName, singletonObject)

Наконец, spring не дает четкого способа изменить bean после обновления контекста, но наиболее распространенными подходами являются: