在CDI中是否存在“本地”范围的bean?

时间:2016-03-15 13:17:38

标签: dependency-injection cdi

“local”是指在方法调用期间创建和销毁bean。这与调用构造函数基本相同,优点是能够在该bean的字段中使用@Inject。

为什么我要这样做
我正在重构使用CDI的遗留代码。我想extract very long methods into classes。该方法中的局部变量将被该类中的字段替换,因此该bean将具有仅属于该短期范围的状态(方法调用的持续时间)。 bean还将依赖于服务和其他更广泛的bean,而不是将长参数列表传递给构造函数。

2 个答案:

答案 0 :(得分:0)

CDI不支持方法注入(除了setter和构造函数)。所以这不可能,因为@Dependent范围依赖于包含bean而不是调用方法。

同样在你的情况下,即使这样做也会产生无限循环,因为你需要将容器传递给子,然后将子传递给容器等等。

解决方案是注入工厂。

答案 1 :(得分:0)

考虑到标准CDI范围,@RequestScoped可能最适合您的短期bean,即使它们的生命周期长于单个方法调用。

无状态@ApplicationScoped bean(例如服务)可以并行使用任意数量的@RequestScoped bean(例如命令)。

如果这不适合您,您始终可以使用CDI扩展名定义自定义范围。