JavaEECDI—每次调用一个方法时都获取一个类的新实例
我希望对Java J2EE应用程序进行一些重构,但我不清楚如何让CDI提供所需的依赖项: 当前设置非常简单/易于理解: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(); } } 现在
@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();