Java Playframework:在全局设置中访问命名缓存

Java Playframework:在全局设置中访问命名缓存,java,playframework-2.4,Java,Playframework 2.4,我正在遵循文档并尝试在我的play(Java)项目中实现一个命名缓存。我的全局类中定义了一个beforeStart方法,如下所示: public class Global extends GlobalSettings { @Inject @NamedCache("system-cache") CacheAPI cache; @Override public void beforeStart(Application app) { ... .

我正在遵循文档并尝试在我的play(Java)项目中实现一个命名缓存。我的全局类中定义了一个beforeStart方法,如下所示:

public class Global extends GlobalSettings {
    @Inject
    @NamedCache("system-cache")
    CacheAPI cache;

    @Override
    public void beforeStart(Application app) {
    ...
    ...
    cache.set("test", "test"); //Throws a NullPointerException
}   
但是,依赖项注入似乎不适用于全局对象。我可以使用以下方式访问默认缓存:

import play.cache.Cache;
....
public class Global extends GlobalSettings {

    public void beforeStart(Application app) {
        Cache.set("test", "test"); //This works
    }
}

如何访问GlobalSettings类中的命名缓存?

在play2.4中,GlobalSettings发生了许多变化,您不应该使用它,而应转到基于GUI的配置,在那里,您可以在应用程序启动和停止时添加“挂钩”

让我们看看为java所做的更改。

请看一下如何向应用程序添加挂钩。

在play2.4中,全局设置有很多更改,您不应该使用它,而应转到基于GUI的配置,在那里,您可以在应用程序启动和停止时添加“挂钩”

让我们看看为java所做的更改。

看看如何为你的应用程序添加一个钩子。

你需要使用一个渴望的单例-这将允许你做任何你想要的注入,并在应用程序启动时运行它

从:

GlobalSettings.beforeStart和GlobalSettings.onStart:启动时需要发生的任何事情现在都应该发生在依赖注入类的构造函数中。当依赖项注入框架加载类时,该类将执行其初始化。如果需要快速初始化(例如,因为需要在应用程序实际启动之前执行一些代码),请定义一个

根据文档示例,您将编写一个模块来声明您的单例:

import com.google.inject.AbstractModule;
import com.google.inject.name.Names;

public class HelloModule extends AbstractModule {
    protected void configure() {

        bind(MyStartupClass.class)
                .toSelf()
                .asEagerSingleton();
    }
}
在MyStartupClass中,使用构造函数定义启动行为

public class MyStartupClass {

    @Inject
    public MyStartupClass(@NamedCache("system-cache") final CacheAPI cache) {    
        cache.set("test", "test");
    }
}

你需要使用一个渴望的单例-这将允许你注入你想要的任何东西,并在应用程序启动时运行它

从:

GlobalSettings.beforeStart和GlobalSettings.onStart:启动时需要发生的任何事情现在都应该发生在依赖注入类的构造函数中。当依赖项注入框架加载类时,该类将执行其初始化。如果需要快速初始化(例如,因为需要在应用程序实际启动之前执行一些代码),请定义一个

根据文档示例,您将编写一个模块来声明您的单例:

import com.google.inject.AbstractModule;
import com.google.inject.name.Names;

public class HelloModule extends AbstractModule {
    protected void configure() {

        bind(MyStartupClass.class)
                .toSelf()
                .asEagerSingleton();
    }
}
在MyStartupClass中,使用构造函数定义启动行为

public class MyStartupClass {

    @Inject
    public MyStartupClass(@NamedCache("system-cache") final CacheAPI cache) {    
        cache.set("test", "test");
    }
}