【发布时间】:2019-09-25 05:34:24
【问题描述】:
我有课
@RequestScoped
public class AFactory {
private final HttpServletRequest request;
protected AFactory () {
this.request = null;
}
@Inject
public AFactory (HttpServletRequest request) {
this.request = request;
}
@Produces
public A getA() {
int random = ...;
A a = new A(request);
a.setRandom(random);
return a;
}
}
我明白了,因为我在做new A(),所以我返回了真实的实例。
这是使用生产者的预期方式吗?
有没有办法返回代理实例?
【问题讨论】:
-
Afaik,用
@Produces注释的方法实际上是代理。该方法是“注入”的。因此,您在每次调用它时都会获得一个新实例,因为您每次都在方法中创建一个新实例。如果你'lazy'实例化它,你每次都会得到相同的A,所以不需要代理。但我可能错了…… -
关于“正确的方式(或错误的方式)”是完全的;;y 取决于您的用例...您是否需要 A 的状态在调用之间保持一致(您的“随机” ) 或不。如果没有,你使用它的方式就可以了,如果它需要相同,就偷懒吧。
-
@Kukeltje 我需要它是
@RequestScoped,因此,同一个实例,在该请求期间使用它的所有 bean 之间具有完全相同的随机数 -
然后在构造函数中执行或在 getter 中执行'lazy'...简单的所有基本 java。
-
虽然我的回答“解决了”你的问题,但我对它为什么表现得像你看到的那样的假设是错误的。它通过解决 CDI 行为并以传统的 java 方式解决它来解决它。请不接受我的答案并接受另一个答案,以便我删除我的答案。