我想知道以下是否可能。出于测试目的,我希望在应用程序上下文中为不同的测试声明不同的模拟类。这些是验收测试,使用 Jersey REST 客户端。有没有办法在运行时动态声明一个bean?Spring 是否有 API 允许在加载上下文后更改应用程序上下文?
问问题
35847 次
1 回答
24
在应用程序上下文中拥有不同 bean 的常用方法是使用配置文件。您可以在以下 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/
关于您的第一个问题,您可以在运行时通过方法声明 bean 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 的明确方法,但最常见的方法是:
- 关闭并再次刷新(显然)
- 使用代理并在运行时交换 targetSource:请参阅Replace spring bean in one context with mock version from another context (例如)。
于 2013-03-11T01:14:01.653 回答