如何使用模块而不是插件插入播放生命周期?

时间:2015-07-25 05:36:59

标签: plugins module lifecycle playframework-2.4

我看到插件类现在已被弃用(从2.4.x版本开始)...在api文档中它说我应该使用模块......所以这是我的问题。 如何编写模块,如何将该模块插入主应用程序的播放生命周期?

1 个答案:

答案 0 :(得分:3)

您没有指定您正在使用的语言,因此我会快速涵盖这两种语言。我将这两个答案基于以下存储库:

爪哇

  1. 以您想要的任何方式编写您的功能 - 没有特定的类可以扩展。如果您对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);
        }
    }
    
  2. 请注意,使用依赖注入代替静态引用。另请注意,我已为此示例提供了@Singleton注释,但也可以使用例如每个请求范围。

    有关详细信息,请参阅the Play DI docs

    1. 公开模块的组件。为此,请扩展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));
          }
      }
      
    2. 在这里,您还可以将实现绑定到接口,配置实例提供程序等。

      1. 如果您正在公开发布该模块,请假设您在此处执行此操作 - 它超出了问题的范围。我们还假设您已经在您正在处理的任何项目中为模块添加了依赖项。

      2. application.conf

        中启用该模块
        play {
            modules {
                enabled += com.example.module.MyModule
            }
        }
        
      3. 通过您的模块公开的组件 - 在此示例中仅为MyModuleCode - 现在可用于注入控制器,操作等。

      4. 如果需要关闭钩子,只需将ApplicationLifecycle注入组件并注册钩子;有关详细信息,请参阅https://playframework.com/documentation/2.4.x/JavaDependencyInjection#Stopping/cleaning-up

      5. Scala的

        1. 以您想要的任何方式编写您的功能 - 没有特定的类可以扩展。如果您对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)) }
          }
          
        2. 请注意,使用依赖注入代替静态引用。另请注意,我已为此示例提供了@Singleton注释,但也可以使用例如每个请求范围。

          有关详细信息,请参阅the Play DI docs

          1. 公开模块的组件。为此,请扩展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])
            }
            
          2. 在这里,您还可以将实现绑定到特征,配置实例提供程序等。

            1. 如果您正在公开发布该模块,请假设您在此处执行此操作 - 它超出了问题的范围。我们还假设您已经在您正在处理的任何项目中为模块添加了依赖项。

            2. application.conf

              中启用该模块
              play {
                  modules {
                      enabled += com.example.module.MyModule
                  }
              }
              
            3. 通过您的模块公开的组件 - 在此示例中仅为MyModuleCode - 现在可用于注入控制器,操作等。

            4. 如果需要关闭钩子,只需将ApplicationLifecycle注入组件并注册钩子;有关详细信息,请参阅https://playframework.com/documentation/2.4.x/ScalaDependencyInjection#Stopping/cleaning-up

            5. 摘要

              模块不再是特殊的 - 它们只是一种对可注射组件进行分组的方法。