当前位置: 首页 > 面试题库 >

我可以在运行时替换Spring bean定义吗?

李跃
2023-03-14
问题内容

请考虑以下情形。我有一个带有bean的Spring应用程序上下文,该bean的属性应该是可配置的,认为DataSourceMailSender。可变的应用程序配置由单独的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的配置时,它将使用此新配置重新创建持有人,并开始委派给它。



 类似资料:
  • 我工作在一个微服务应用程序,有多个服务。我正在使用docker-compose运行不同微服务的实例。我们为每个微服务创建一个映像。如果我改变了一个微服务的代码,我使用'docker-compose down',然后改变更新的微服务的版本,然后使用'docker-compose up'。我认为,应该有一种不使用'docker-compose down'和'docker-compose up'的方法在

  • TL;dr:有可能制作一个可重复使用的模板文字吗? 我一直在尝试使用模板文字,但我想我只是不明白,现在我很沮丧。我的意思是,我想我明白了,但“它”不应该是它的工作方式,或者它应该如何得到。它应该会有所不同。 我看到的所有示例(甚至标记的模板)都要求在声明时而不是运行时进行“替换”,这对我来说对模板来说是完全无用的。也许我疯了,但对我来说,“模板”是一个文档,它包含在使用时被替换的标记,而不是在创建

  • 我有一个cucumber test runner类,我在其中编写了如下运行的测试套件 @cucumberoptions(features={“feature_files/featues”},glue={“com.automation.stepdef”},monochrome=true,dryrun=false,plugin={“html:target/cucumber-html-report”},

  • 问题内容: 在我的应用程序中,我必须用自定义的QLineEdit替换所有QLineEdit元素。为此,有不同的解决方案: 修改从pyuic4生成的py文件,然后用我的一个LineEdit替换所有QLineEdit对象。该解决方案并不是真正的最佳解决方案,因为每次运行pyuic4时,我都会丢失对所做的修改,并将其保存到生成的输出文件中。 编写一个新类,在我的窗口或对话框中递归搜索QLineEdit小

  • 问题内容: 我正在使用 EclipseLink的JAXB实现的一些非标准扩展,并且要启用该实现,必须使用jaxb.properties对其进行配置。效果很好。 但是,由于生成错误,属性文件未包含在正确的位置,从而导致使用默认的JAXB,该文件没有任何错误,只是继续解析XML文件,忽略了非标准扩展名,给我留下了一个非工作bean。 为了使它更加健壮,我想摆脱属性文件,并在代码中指定上下文配置。由于它

  • 问题内容: 我有一个用CoffeeScript编写的node.js应用程序。 我想知道在Heroku上托管应用程序需要什么。 谢谢 问题答案: 由于Heroku的更新,它现在允许安装源。以下答案是Heroku完全支持之前的一种变通方法。对于目前更好的解决方案,请参阅更高的额定回答解释了如何简单地使用从在Heroku。 老实说,最好的方法是像Peter所建议的那样事先使用它进行编译,但是我不知道您是