Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 有“a”这样的东西吗;“本地”;CDI中的作用域bean?_Dependency Injection_Cdi - Fatal编程技术网

Dependency injection 有“a”这样的东西吗;“本地”;CDI中的作用域bean?

Dependency injection 有“a”这样的东西吗;“本地”;CDI中的作用域bean?,dependency-injection,cdi,Dependency Injection,Cdi,所谓“本地”是指在方法调用期间创建和销毁bean。这与调用构造函数基本相同,优点是能够在bean的字段中使用@Inject 我为什么要这样做 我正在重构使用CDI的遗留代码。我想去。方法中的局部变量将被类中的字段替换,因此bean将具有只属于该短期作用域的状态(方法调用的持续时间)。bean还将依赖于服务和其他范围更广的bean,我宁愿注入它们,也不愿将一个长参数列表传递给构造函数。CDI不支持方法注入(除了setter和构造函数)。所以这是无法做到的,因为@Dependent作用域依赖于包含的

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

我为什么要这样做

我正在重构使用CDI的遗留代码。我想去。方法中的局部变量将被类中的字段替换,因此bean将具有只属于该短期作用域的状态(方法调用的持续时间)。bean还将依赖于服务和其他范围更广的bean,我宁愿注入它们,也不愿将一个长参数列表传递给构造函数。

CDI不支持方法注入(除了setter和构造函数)。所以这是无法做到的,因为@Dependent作用域依赖于包含的bean,而不是调用方方法

同样在您的情况下,即使这样做有效,它也会产生一个无限循环,因为您需要将容器传递给子容器,然后将子容器传递给容器,依此类推


解决方案是注入一个工厂。

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

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


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

如果您重构类,您可以将它们变成一个“无状态”应用程序范围bean,这样您就不需要考虑更窄的范围