【问题标题】:Re initialize bean in spring during runtime在运行时重新初始化spring中的bean
【发布时间】:2014-12-17 19:38:33
【问题描述】:

我想知道是否有可能在 web 应用启动时重新创建一个已经在 java 配置中创建的 bean。

我想做的是重新配置 bean 设置。

例如,我使用数据库路径创建新 bean:

     @Bean
     public TestBean getTestBean() {
         TestBean tb = new TestBean("some_path_taken_from_external_point");
         return tb;
     }

在运行时我想更改路径。让我们假设这个 bean 没有数据库路径的 setter 方法。 我将有某种事件和该事件的侦听器。侦听器应使用新路径重新初始化 TestBean。

这可能吗?

我在想某种包装器。在这种情况下,我将拥有 TestBeanWrapper 类,该类将具有 get() 方法,该方法将返回 TestBean 实例和 recreate(String path),它将创建具有给定路径的新对象。

我不确定这样的包装器是否适合我,因为 TestBean 是来自外部库的一个类,我不确定它是否没有注入到某个地方(但可能没有注入)。

更可能的是其他 bean 可能依赖于 TestBean,因此它们也必须重新初始化(以防它们没有我的 TestBean 的设置器)。

这在 Spring (4.1) 中是否可行?对于这种情况,最好的方法是什么?

【问题讨论】:

    标签: java spring initialization javabeans


    【解决方案1】:

    所以我仍然不确定您为什么要更改路径,但我有 2 条建议:

    1.看看在 Bean 上设置范围。 通过在 bean 上设置范围,您可以根据上下文重新生成 bean。更多信息请查看Bean Scopes

    2。看看可能使用控制器或服务。 控制器和服务允许 getter 和 setter,这可能会给你更多的控制权。

    【讨论】:

    • 路径只是一个例子。这只是我想在运行时管理的配置。我不想重新部署整个应用程序来更新配置。我知道它看起来不正确,因为这样的 bean 应该有 setter/getter,但是这些类不是我创建的,也没有那些 setter。具有范围的 Bean 不是我要寻找的,因为这些 bean 是全局的。 @2 这些类已经由 maven 依赖提供,所以我不能向它们添加 setter 或 getter。
    • 好的...你看过控制器和服务了吗? \@Service 是从模型和视图中抽象配置的好方法。过去,我在服务后面托管了一个属性文件来控制我的网站的外观。可以使用 \@autowired 注释在全局范围内轻松访问它。您能否举一个更相关的示例来说明您正在使用的 getter 和 setter,以便我可以考虑更多。
    • 是的,我看过它们,但它们不能解决我的问题。我想重新创建对象,如果没有一些魔法,两个注释是否不允许我这样做。这些对象没有 getter/setter,因此提供新配置的唯一方法是重新创建对象