Java Play Framework 2.4-替换GlobalSettings.onStart()的依赖项注入

Java Play Framework 2.4-替换GlobalSettings.onStart()的依赖项注入,java,playframework,dependency-injection,guice,playframework-2.4,Java,Playframework,Dependency Injection,Guice,Playframework 2.4,我对依赖注入感到困惑。我想要实现的是用这些对象的适当依赖注入来替换GlobalSettings.onStart()调用,我在2.3中初始化了一些静态单例对象 我想做的是: 控制器->模型(将对象注入此模型) 到目前为止,我所做的只是一个折衷的措施;在控制器中: private static SomeObject myStaticSingletonObject = new SomeObject(); public Promise<Result> getSomeData() {

我对依赖注入感到困惑。我想要实现的是用这些对象的适当依赖注入来替换
GlobalSettings.onStart()
调用,我在2.3中初始化了一些静态单例对象

我想做的是:

控制器->模型(将对象注入此模型)

到目前为止,我所做的只是一个折衷的措施;在控制器中:

private static SomeObject myStaticSingletonObject = new SomeObject();

public Promise<Result> getSomeData() {
    return handleRequest(() -> new SomeDataAjaxRequest(myStaticSingletonObject));
}

public Promise<Result> handleRequest(Function0<AbstractAjaxRequest<?>> supplier) {
    Promise<AbstractAjaxRequest<?>> promise = Promise.promise(supplier);
    return promise.map(arg -> ok(arg.getResponse()));
}
在我的build.sbt中,我有:

routesGenerator := InjectedRoutesGenerator
所以基本上我的问题是我应该如何将SomeObject注入到我的模型中,以及我应该如何创建我的SomeObject对象,我不认为我应该使用
newSomeObject()

理想情况下,我希望对这些对象使用字段注入,因为我不想使构造函数混乱,因为构造函数实际上可能具有模型的相关参数,而不仅仅是这些包含事物定义的实用程序类(SomeObject基本上只是从数据库加载一些信息,在应用程序的整个生命周期中,这些信息当前是静态的,但这可能会改变)

另外,可能值得注意的是,我打算使用Guice来管理DI


我知道我应该创建一个Guice DI工厂,并且已经看过了相关文档,但我仍然不确定如何将其集成到我的play应用程序中。

您不需要为此显式创建Guice DI工厂

相反,创建一个模块并使用它来配置任何绑定,以及(对您来说很重要的)对
onStart()
的替换

在控制器中,只需像平常一样注入实例:

public class SomeController extends Controller {
    private final SomeObject someObject;

    @Inject
    public SomeController(final SomeObject someObject) {
        this.someObject = someObject;
    }

    public Promise<Result> getSomeData() {
        return handleRequest(() -> new SomeDataAjaxRequest(someObject));
    }

    public Promise<Result> handleRequest(Function0<AbstractAjaxRequest<?>> supplier) {
        return Promise.promise(supplier)
                      .map(arg -> ok(arg.getResponse()));
    }
}
公共类SomeController扩展控制器{
私有的最后某物某物某物;
@注入
公共SomeController(最终SomeObject SomeObject){
this.someObject=someObject;
}
公共承诺getSomeData(){
returnhandleRequest(()->newsomeDataAjaxRequest(someObject));
}

public Promise HandlerRequest(函数0当我在Play 2.4.2中尝试此答案顶部的示例代码时,会出现许多编译器错误,例如“…模块必须声明为抽象或实现配置().上面的代码是如何编译的?自从这篇文章发表以来,Play有了这么大的变化吗?我知道在哪里可以找到早期自绑定的工作示例代码吗?我刚刚注意到导入和超类是错误的-我已经更正了示例。感谢您这么快的响应。我已经看到了一些早期绑定示例。我认为它们是用于玩的2.4.x.一些实现模块。另一些扩展AbstractModule。这两种方法之间有什么重要区别吗?
模块
是Play internal,因此,如果您编写一个用于一般消费的模块,它不会强制依赖于像Guice这样的特定框架。如果您编写一些用于内部使用的模块,您可以使用f特定于框架的类,如Guice的
AbstractModule
。有关更多信息,请参阅。谢谢。现在我的模块已编译!下一步是找出获取环境配置的新播放方式。看起来像
公共静态最终字符串myVar=Play.application().config().getString(…)
可能导致一个早期绑定组件出现启动错误。
import play.api.inject.Module;

public class SomeModule extends Module {
    @Override
    public Seq<Binding<?>> bindings(final Environment environment,
                                    final Configuration configuration)
    {
        return seq(bind(SomeObject.class).toSelf().eagerly());
    }
}
play {
  modules {
    enabled += "com.example.SomeModule"
  }
}
public class SomeController extends Controller {
    private final SomeObject someObject;

    @Inject
    public SomeController(final SomeObject someObject) {
        this.someObject = someObject;
    }

    public Promise<Result> getSomeData() {
        return handleRequest(() -> new SomeDataAjaxRequest(someObject));
    }

    public Promise<Result> handleRequest(Function0<AbstractAjaxRequest<?>> supplier) {
        return Promise.promise(supplier)
                      .map(arg -> ok(arg.getResponse()));
    }
}