我看到插件类现在已被弃用(从2.4.x版本开始)...在api文档中它说我应该使用模块......所以这是我的问题。 如何编写模块,如何将该模块插入主应用程序的播放生命周期?
答案 0 :(得分:3)
您没有指定您正在使用的语言,因此我会快速涵盖这两种语言。我将这两个答案基于以下存储库:
以您想要的任何方式编写您的功能 - 没有特定的类可以扩展。如果您对Play组件(如Configuration
)有依赖关系,则应注入它们。
@Singleton
public class MyModuleCode {
private final boolean enableWidgets;
@javax.inject.Inject
public MyModuleCode(final Configuration configuration) {
this.enableWidgets = configuration.getBoolean("widgets.enabled", false);
}
}
请注意,使用依赖注入代替静态引用。另请注意,我已为此示例提供了@Singleton
注释,但也可以使用例如每个请求范围。
有关详细信息,请参阅the Play DI docs
公开模块的组件。为此,请扩展play.api.inject.Module
类并实施public Seq<Binding<?>> bindings(final Environment environment, final Configuration configuration)
。
package com.example.module;
public class MyModule extends Module
{
@Override
public Seq<Binding<?>> bindings(final Environment environment,
final Configuration configuration)
{
return seq(bind(MyModuleCode.class).toSelf().in(Singleton.class));
}
}
在这里,您还可以将实现绑定到接口,配置实例提供程序等。
如果您正在公开发布该模块,请假设您在此处执行此操作 - 它超出了问题的范围。我们还假设您已经在您正在处理的任何项目中为模块添加了依赖项。
在application.conf
。
play {
modules {
enabled += com.example.module.MyModule
}
}
通过您的模块公开的组件 - 在此示例中仅为MyModuleCode
- 现在可用于注入控制器,操作等。
如果需要关闭钩子,只需将ApplicationLifecycle
注入组件并注册钩子;有关详细信息,请参阅https://playframework.com/documentation/2.4.x/JavaDependencyInjection#Stopping/cleaning-up。
以您想要的任何方式编写您的功能 - 没有特定的类可以扩展。如果您对Play组件(如CacheApi
)有依赖关系,则应注入它们。
@Singleton
class DefaultPatternCache @Inject() (cache: CacheApi) extends PatternCache {
override def apply(value: String): Option[Pattern] = cache.getOrElse[Option[Pattern]](key = s"Deadbolt.pattern.$value") { Some(Pattern.compile(value)) }
}
请注意,使用依赖注入代替静态引用。另请注意,我已为此示例提供了@Singleton
注释,但也可以使用例如每个请求范围。
有关详细信息,请参阅the Play DI docs
公开模块的组件。为此,请扩展play.api.inject.Module
类并实施def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]]
。
package com.example.module
import com.example.module.cache.{DefaultPatternCache, PatternCache}
import play.api.inject.{Binding, Module}
import play.api.{Configuration, Environment}
class MyModule extends Module {
override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq(bind[PatternCache].to[DefaultPatternCache])
}
在这里,您还可以将实现绑定到特征,配置实例提供程序等。
如果您正在公开发布该模块,请假设您在此处执行此操作 - 它超出了问题的范围。我们还假设您已经在您正在处理的任何项目中为模块添加了依赖项。
在application.conf
。
play {
modules {
enabled += com.example.module.MyModule
}
}
通过您的模块公开的组件 - 在此示例中仅为MyModuleCode
- 现在可用于注入控制器,操作等。
如果需要关闭钩子,只需将ApplicationLifecycle
注入组件并注册钩子;有关详细信息,请参阅https://playframework.com/documentation/2.4.x/ScalaDependencyInjection#Stopping/cleaning-up。
模块不再是特殊的 - 它们只是一种对可注射组件进行分组的方法。