Ответ 1
Общим способом использования разных beans в контексте приложения является использование профилей. Вы можете прочитать о профилях в следующих spring источниках сообщений:
- http://blog.springsource.org/2011/02/14/spring-3-1-m1-introducing-profile
- http://blog.springsource.org/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles/
О вашем первом вопросе вы можете объявить 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 после обновления контекста, но наиболее распространенными подходами являются:
- закрыть и обновить снова (честно)
- Используйте прокси и замените целевой источник во время выполнения: см. Заменить spring bean в одном контексте с макетной версией из другого контекста (например).