Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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
JavaEECDI—每次调用一个方法时都获取一个类的新实例_Java_Dependency Injection_Cdi - Fatal编程技术网

JavaEECDI—每次调用一个方法时都获取一个类的新实例

JavaEECDI—每次调用一个方法时都获取一个类的新实例,java,dependency-injection,cdi,Java,Dependency Injection,Cdi,我希望对Java J2EE应用程序进行一些重构,但我不清楚如何让CDI提供所需的依赖项: 当前设置非常简单/易于理解: @ApplicationScoped public class MyApplication { @Inject @Named("Default") private Dependency dependency; public void dostuff(){ dependency.process(); } } 现在

我希望对Java J2EE应用程序进行一些重构,但我不清楚如何让CDI提供所需的依赖项:

当前设置非常简单/易于理解:

@ApplicationScoped
public class MyApplication  {


    @Inject
    @Named("Default")
    private Dependency dependency;

    public void dostuff(){
        dependency.process();
    }

}
现在,每次调用
dostuff
时,我都需要一个新的
dependency
实例

我不清楚如何使用CDI为我创建这个。我的依赖项有自己的依赖项,我希望CDI为我创建这些依赖项

我希望我需要添加一层间接性

其他背景: 此类是轮询要完成的工作的流程的一部分,托管在Wildfly中。
我们在项目中没有使用Spring。

除了依赖项注入之外,您还需要使用CDI吗

如果不是,我建议让doStuff()将依赖项对象作为参数:

public void doStuff(Dependency dependency) {
  dependency.process();
}
然后,在调用该方法时,为其提供一个新的依赖实例:

myApplication.doStuff(new Dependency());

这样,与在构造函数或字段中声明一个新实例相比,您仍然可以减少类的耦合。

因为您需要的是一个
依赖关系的新实例,每次调用该方法时,我认为您需要的是
提供程序的一个实例,即(
javax.inject.Provider
)注入类/
bean

将提供程序注入当前类:

@Inject Provider<DesiredBean> provider;

这应该会让你走起来。

谢谢你的反馈!主要原因是我的依赖项有dal对象和容器管理的EntityManager等。它是可以改变的,但它不是微不足道的。其他有趣的事实:依赖项是一个接口,它的具体类会找出它应该依赖于上下文/数据库信息的依赖项。这不是我问题的核心,只是说,我宁愿避免做可能的事。如果CDI不能胜任任务,我可能需要考虑这个问题。方法调用边界与任何标准的托管bean范围都不对应。我不确定这是否完全违背了你的想法,因为可以定义自定义范围,但换个方向可能更快更容易。拦截器似乎更适合每个方法调用操作,但我现在还不清楚如何利用它们来获得所需的行为。
依赖关系的范围是什么?如果它是
@依赖的
,那么注入一个
实例
将实现您想要的-只需记住在
最后
块中调用
实例.destroy()
,否则将发生内存泄漏。如果您能更详细地描述问题及其约束,可能还有其他解决方案。从功能上讲,我希望依赖项的作用域与requestScope的作用域相似。但是,由于“owning class”父类的作用域更大,所以不容易实现;要清理它拥有的对象或EntityManager,或它的任何依赖项?根据我个人的经验/使用,我从未破坏过获得的bean。所以我不能发誓你是否需要摧毁它。但是,由于CDI实现了
Provider
接口,并且您希望始终有一个新实例,因此使用
CDI.current().destory(desiredBean)
销毁实例应该不会有任何伤害。有没有办法将此技术与
@Inject
@any
一起使用?
DesiredBean desiredBean = provider.get();