1

使用 Arquillian JUnit(版本 1.1.1 和 4.11)设置嵌入 JDK 1.7.25 的 CDI(Weld 1.1.13.Final 上的 1.0.0.CR7)......

获得了以下课程:

public class Receiver {
  private String message;

  public void catching(@Observes DummyEvent event) {
    System.out.println(String.format("message [%s], hash [%d]", event.getMessage(), hashCode()));
    this.message = event.getMessage();
  }

  public String getMessage() {
    return this.message;
  }
}

public class Sender {
  @Inject @Any
  Event<DummyEvent> e;

  public void fire(String message) {
    System.out.println(String.format("fire message [%s], hash [%d]", message, hashCode()));

    DummyEvent de = new DummyEvent;
    de.setMessage(message);
    e.fire(de);
  }
}

@RunWith(Arquillian.class)
public class Example {
  @Deployment
  public static JavaArchive createDeployment() {
    return ShrinkWrap.create(JavaArchive.class).addClasses(Example .class, Receiver.class, Sender.class)
         .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
  }

  @Inject
  Receiver receiver;

  @Inject
  Sender sender;

  @Test
  public void dummy() {
    System.out.println(String.format("sender hash [%d]", sender.hashCode()));
    sender.fire("Hello from me");

    System.out.println(String.format("message [%s], receiver hash: [%d]",
    receiver.getMessage(), receiver.hashCode()));
  }
}

打印的内容如下:

sender hash [785714873]
firing event [value: Hello from me], hash [785714873]
message [Hello from me], hash [632925108]
message [null], receiver hash: [1085786565]

我不明白为什么接收器哈希码不同并且事件没有传播到示例 JUnit 中注入的接收器 bean。而是将事件发送到某个 OTHER 接收器 bean。

这与范围(应该是默认的@Dependent)有关吗?

4

1 回答 1

2

它看起来ReceiverSender没有定义范围。结果,他们将获得@Dependent他们的范围。当您使用@Dependent新实例时,会在每个注入点注入。

于 2013-12-20T23:54:14.783 回答