【问题标题】:Re-inject CDI bean if some injected property changed如果某些注入的属性发生更改,则重新注入 CDI bean
【发布时间】:2019-03-21 18:07:35
【问题描述】:

我有一个注入属性private int url的bean BeanA:

class BeanA { @Value(${"db.url"}) private String url; private DbConnection connection; }

让我们说这个Value注解类似于Spring Value。在初始化过程中,将使用注入属性到 url 字段来初始化连接。在BeanA 中还有一些PostConstruct and PreDestroy 方法。 我的问题是:当url 属性更改时,是否可以动态重新实例化BeanA。我有检测属性变化的机制。现在,我只是重新注入这个 url,但我想重新创建这个 bean,初始化新连接并在所有依赖 bean 中重新注入这个 bean。我不使用 Spring Cloud Config。

【问题讨论】:

  • @RefreshScope 在这个答案中看起来很有帮助:(但它取决于 Spring Cloud)stackoverflow.com/questions/51218086/…
  • 是的,但它来自 Spring。我不使用弹簧。我现在看到的唯一方法是使用 Context 实现我自己的 RefreshScope。

标签: jakarta-ee dependency-injection cdi weld


【解决方案1】:

如果你根本不使用spring,我建议:

  1. 让“bean”保持原样。 (所以它将作为单例)。
  2. 在bean中添加一个方法:getConnection()
  3. 当属性更改时,在该 bean 中重新创建一个新连接。
  4. 任何需要连接的组件总是会调用 bean 的 getConnection() 并且总是会得到最新的连接实例。

您可能希望使用代理设计模式,其中您的 bean 由客户端使用,但在内部引用另一个连接 bean(“目标”bean),并且可以用全新 bean 的新实例替换目标。但始终,客户端/用户持有对代理的相同引用。

【讨论】:

  • 谢谢,但问题是我正在编写一个库。因此,如果客户将使用它,我只想在该 bean 的属性发生变化时重新加载他的 bean,我认为应该可以以某种通用方式进行。
  • 1.那么这是一个纯Java类吗? 2. bean 是 lib 的一部分还是用户类?我的意思是,它仍然可以是一个类,用户总是对它有相同的引用,但类的状态会发生变化。 (如上面的答案所述)。否则,您可能希望使用代理设计模式,其中您的 bean 由客户端使用,但在内部引用另一个连接 bean(“目标”bean),并且可以用全新 bean 的新实例替换目标。但始终,客户端/用户拥有对代理的相同引用。
  • 对不起,这只是一个例子。我的意思是,一旦它们的属性发生变化,我想以某种方式重新加载 bean(重新实例化并重新注入所有依赖的 bean)并重新注入这些属性,就像我对这个 url 所做的那样。
  • 好的,如果我理解正确的话,我应该将我的实例包装在某个代理中并将这个代理注入所有依赖的bean,一旦实际实例的内部状态发生变化,我只重新实例化目标实例但是所有依赖的bean都不会改变对代理的依赖。像那样吗?
  • 是的,没错!我还将修改我的答案以包含此代理选项...
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 2019-03-03
  • 1970-01-01
  • 2015-04-15
  • 2015-02-12
  • 2019-10-19
  • 2019-08-04
  • 1970-01-01
相关资源
最近更新 更多