【问题标题】:@Produces CDI annotation is creating 4 different obejct for each request@Produces CDI 注释为每个请求创建 4 个不同的对象
【发布时间】:2020-03-24 23:36:21
【问题描述】:

注释

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface TestQualifier{

}

@Producer 类

@RequestScoped
public class TestProducer {

  @Produces
  @TestQualifier
  public String getTestString()
  { 
    System.out.println("Initializing  test string");
    return "Test String";
  }
}

应该进行注入的类

public class TestClass
{
    @Inject
    @TestQualifier
    private String testString;

    public void TestMethod() {
        System.out.println(testString);
    }
}

当我将此代码部署到 JBoss EAP 时,我确实看到每个请求都打印了 4 次“初始化测试字符串”。

有人可以提供一些详细信息,说明为什么我确实看到 4 次“初始化测试字符串”而不是 1 次。

是否有任何解决方案可以为当前 4 次的每个请求范围仅生成一次实例。

谢谢

【问题讨论】:

标签: cdi


【解决方案1】:

您所说的生产者方法如下所示:

@Produces
@TestQualifier
public String getTestString()
{ 
  System.out.println("Initializing  test string");
  return "Test String";
}

……就像你写的一样:

@Produces
@Dependent // the default scope for produced objects is @Dependent
@TestQualifier
public String getTestString()
{ 
  System.out.println("Initializing  test string");
  return "Test String";
}

……你要写的是这样的:

@Produces
@RequestScoped // you want to produce a string in request scope
@TestQualifier
public String getTestString()
{ 
  System.out.println("Initializing  test string");
  return "Test String";
}

为了回答您的问题,@Dependent 范围的意思是“每次调用一个新对象时创建一个新对象”。您希望“仅在有新请求时才创建新对象”。

【讨论】:

  • OP 表示重复的问题没有回答他们的问题。我尝试了不同的方法来回答。
  • Op 没有“认真”;尝试了解重复的 imo。您的表述应该是对另一个问题的附加答案,以防止碎片化。你的比基于规范的更“可操作”,所以它也可能帮助其他人在那里复制。顺便称赞一下您在这方面的知识。我本可以回答这个问题,但其他人没有。干杯...
  • @Liard Nelson,感谢您的回复。我很抱歉,因为我出去了一段时间。我确实了解范围在 EJB 中的工作原理。但是我的问题是,对于每个请求,我确实看到字符串“初始化测试字符串”被打印了 4(四)次。我只是想知道为什么该produces 方法为每个请求调用4 次?。我还根据要求添加了范围来生成方法,但我仍然看到上面的字符串为每个请求打印了 4 次
  • 如果您真的已将@Produces @TestQualifier public String getTestString() { System.out.println("Initializing test string"); return "Test String"; } 更改为@Produces @RequestScoped @TestQualifier public String getTestString() { System.out.println("Initializing test string"); return "Test String"; } 并且您仍然获得此方法的四次调用,那么我不知道,实际上这应该是不可能的所有已知的 CDI 实现。
猜你喜欢
  • 2014-11-10
  • 1970-01-01
  • 2016-09-22
  • 2021-07-20
  • 2015-11-29
  • 2016-02-06
  • 2014-07-31
  • 2021-12-03
  • 2020-05-15
相关资源
最近更新 更多