2017-10-10 141 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

相關問題