【问题标题】:Why I can't inject multiple instances of a bean?为什么我不能注入一个 bean 的多个实例?
【发布时间】:2013-12-24 23:38:44
【问题描述】:

我有两个豆子:一个管理一只股票,另一个管理两只股票之间的变动。所以,在 MovStock bean 中我有:

@EJB
private Stock stock1;
@EJB
private Stock stock2;

[...]

public void setStocks(int idStock1, int idStock2) {
  stock1.loadStock(idStock1);
  stock2.loadStock(idStock2);
}

在我的代码中的某个地方,在另一个 bean 上,我这样做:

@EJB
private MovStock movStock;

[...]

movStock.setStocks(10,20);

但它会导致 stock1 和 stock2 持有相同的股票 (20)。当然我做错了什么,但是使用 @PersistenceContext 等的同一 bean 的多个实例的正确方法是什么?

谢谢

【问题讨论】:

  • 可能是因为注入的实例对于两个Stock 都是相同的,所以您需要某种限定符来注入两个不同的实例
  • 是的,但是什么限定词?我被困住了。

标签: java jakarta-ee jpa dependency-injection javabeans


【解决方案1】:

Bean 是容器管理的。所以你不必担心实例。容器将在需要时创建新的,但它会具有相同的状态(如果有状态)。看起来Stock 不应该是 Enterprise Bean,而是 DTO。您不应该在 EJB 上执行数据操作。 EJB 应该在适当的结构 (DTO) 上执行它。

【讨论】:

  • 嗯,也许我的问题不清楚。 Stock 是一个持有管理股票逻辑的 bean(即:add、sub),而 MovStock 是一个持有管理运动逻辑的 bean(将 10 从 stock1 移动到 stock2),所以在 MovStock 中我需要使用 Stock bean(一个运动使用运动实体、一个 jpa 表和两个库存,分别用于添加和子数量)。
  • 为了对实体执行操作,我们使用 Dao(数据访问对象)。Dao 可以是 EJB。但是对于保存数据,您应该创建 DTO。该 DTO 不是容器管理的,因此您可以拥有多个独立的实例。 Stock is a bean that hold the logic for managing a stock - 没错,但 Stock 不应该包含 stock。这应该是不同的对象,而不是 EJB。
  • 所以,如果我理解的话,我需要两个 bean(stock 和 movstock 逻辑)、两个实体(绑定到 stock 和 movstock 表)和各种 DTO,而在 Stock bean 中我不能例如,使用 this.idStock,但我必须在我的 MovStock 中管理两个 DTO 并将其传递给 Stock bean?所以不可能有一个股票持有逻辑和“当前”股票?
  • 很难说,因为我不知道你为什么要持有“当前”股票,但是是的。除非您不希望共享“当前”股票...但通常,“当前”股票 dto 应包含在运行时方法中(即调用股票逻辑方法的方法)
  • 也许它是“旧风格”,但我喜欢这样做:Stock s = new Stock() s.load(1); s.add(5); s.save(); 所以我试图将逻辑和一些数据放在同一个对象中,但我认为这不是使用 bean 的重点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多