2017-10-10 86 views
1

让我们想象一下我想要一个not.my.Clock通过我的应用程序:如何为我未在Java EE中编写的类定义单例对象?

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() 
} 

我如何定义一个单独的对象为我的整个应用程序而不是一个单供应商,这样我可以编写下面的代码? Java EE 7教程only speaks about singleton session bean, not singleton objects

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

如果我不得不在吉斯写这个,我会写这样的事:

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

或者

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

你能不能延长'Clock'成'@辛格尔顿类SingletonClock扩展Clock'? – daniu

+1

@daniu不,因为我实际上从某个地方得到了独一无二的实例,我没有把它放在手上。另外,我拿'Clock'作为例子,而不是我真正的用例。但为了这个问题,让我们想象一下'Clock'类也是最终的。我将修改 –

+0

在'public Clock get()'方法上使用CDI'@Produces @ ApplicationScoped' – Rouliboy

回答

1

您可以在public Clock get()方法使用@Produces@ApplicationScoped注释产生Clock单:

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

与CDI,你会想去@ApplicationScoped(一个共享实例在您的应用程序中)而不是@Singleton(您的意思是EJB 1?或CDI 1?)。

然后你想要对所有你想变成bean的“非bean”做什么 - 告诉CDI如何生成这样的bean。

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

有了那么上面你可以在你的代码,会调用这个制片人,以创建bean做@Inject Clock clock

如果您想了解更多有关制作人的内容,请登录this chapter in CDI spec

相关问题