我可以在运行时替换Spring bean定义吗?
请考虑以下情形。我有一个带有bean的Spring应用程序上下文,该bean的属性应该是可配置的,认为DataSource
或MailSender
。可变的应用程序配置由单独的Bean管理,我们称之为configuration
。
管理员现在可以更改配置值,例如电子邮件地址或数据库URL,我想在运行时重新初始化配置的bean。
假设我不能只是简单地修改上述可配置bean的属性(例如,由FactoryBean
或构造函数注入创建),而必须重新创建bean本身。
关于如何实现这一点的任何想法?我很高兴收到有关如何组织整个配置内容的建议。没有固定的东西。:-)
编辑
为了澄清一点:我不是在问如何更新配置或如何注入静态配置值。我将尝试一个示例:
<beans> <util:map id="configuration">
<!-- initial configuration -->
</util:map>
<bean id="constructorInjectedBean" class="Foo">
<constructor-arg value="#{configuration['foobar']}" />
</bean>
<bean id="configurationService" class="ConfigurationService">
<property name="configuration" ref="configuration" />
</bean>
</beans>
因此,有一个constructorInjectedBean
使用构造函数注入的bean 。想像一下,bean的构建非常昂贵,因此,使用原型作用域或工厂代理不是一种选择DataSource
。
我想做的是,每次更新配置时(通过重新创建configurationServicebean constructorInjectedBean
并将其重新注入到应用程序上下文和从属bean中)。
我们可以放心地假设constructorInjectedBean
正在使用接口,因此代理魔术确实是一种选择。
我希望这个问题更加清楚。
回答:
我可以想到一种“持有者bean”方法(本质上是一个装饰器),其中持有者bean委托给holdee,而持有者bean作为依赖项注入到其他bean中。除持有人外,没有其他人提及被持有人。现在,当更改Holder bean的配置时,它将使用此新配置重新创建持有人,并开始委派给它。
以上是 我可以在运行时替换Spring bean定义吗? 的全部内容, 来源链接: utcz.com/qa/433173.html