有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

范围如何为我没有在JavaEE中编写的类定义单例对象?

让我们想象一下,我希望通过我的应用程序获得一个not.my.Clock

public final class Clock {
  ... // business
}

我可以写以下内容:

@Singleton
public class ClockProvider implements Supplier<Clock> {
  private Clock clock;
  @PostConstruct
  void init() {
    clock = ... ;
  }
  @Override
  public Clock get() {
    return clock;
  }
}

@RequestScoped
public class MyBean {
  @Inject ClockProvider clockProvider;
  // Use clockProvider.get()
}

如何为整个应用程序定义一个单例对象而不是单例提供程序,以便编写以下代码?JavaEE7教程only speaks about singleton session bean, not singleton objects

@RequestScoped
public class MyBean {
  @Inject Clock clock;
  // Use clock directly: no clock-provider.
}

如果我必须用Guice写这篇文章,我会这样写:

bind(Clock.class).toInstance(...);

@Provides @Singleton Clock provideClock() {
  return ... ;
}

共 (2) 个答案

  1. # 1 楼答案

    有了CDI,你会想选择@ApplicationScoped(应用程序中的一个共享实例),而不是@Singleton(你是指EJB one还是CDI one?)

    然后你想用你想变成豆子的所有“非豆子”做什么——你告诉CDI如何生产这样的豆子

    @Produces
    @ApplicationScoped
    public Clock produceClock() {
      Clock clock = ... // any code you use to create or retrieve the instance
      return clock;
    }
    

    有了上面的代码,您就可以在代码中执行@Inject Clock clock,这将调用这个生产者来创建bean

    如果你想了解更多关于制片人的信息,请点击this chapter in CDI spec

  2. # 2 楼答案

    可以在public Clock get()方法上使用@Produces@ApplicationScoped注释来生成Clock单例:

    @Produces
    @ApplicationScoped
    public Clock get() {
        // your code
    }