范围如何为我没有在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 ... ;
}
# 1 楼答案
有了CDI,你会想选择
@ApplicationScoped
(应用程序中的一个共享实例),而不是@Singleton
(你是指EJB one还是CDI one?)然后你想用你想变成豆子的所有“非豆子”做什么——你告诉CDI如何生产这样的豆子
有了上面的代码,您就可以在代码中执行
@Inject Clock clock
,这将调用这个生产者来创建bean如果你想了解更多关于制片人的信息,请点击this chapter in CDI spec
# 2 楼答案
可以在
public Clock get()
方法上使用@Produces
和@ApplicationScoped
注释来生成Clock
单例: