Play模块中用Guice创建AbstractModule时,如何非废弃方式访问application.conf?
解决Guice模块中访问Play配置的问题
你遇到的问题很典型:Guice的AbstractModule实例是在注入器初始化之前创建的,所以模块类本身的@Inject字段不会被Guice处理——这就是为什么你的Config实例无法正常注入的原因。下面提供两种不需要使用废弃Play.configuration API的解决方案:
方法1:使用@Provides注解(推荐)
这种方式更符合Guice的设计理念,让Guice在注入器就绪后自动处理Config的注入,不需要手动传递配置:
@Singleton public class DatastoreModule extends AbstractModule { @Override public void configure() { // 这里无需额外绑定,除非你有其他类需要配置 } @Provides @Singleton public Datastore provideDatastore(Config config) { // 在这里Config已经可以正常注入了 MongoClient mongo = new MongoClient( config.getString("mongodb.host"), config.getInt("mongodb.port") ); Morphia morphia = new Morphia(); return morphia.createDatastore( mongo, config.getString("mongodb.databaseName") ); } }
原理说明:
Guice会在注入器完全初始化后,调用带有@Provides注解的方法,此时容器中已经存在Play自动绑定的Config实例,所以可以直接作为方法参数注入。同时@Singleton确保Datastore实例全局唯一。
方法2:通过构造函数传递Config
如果你更倾向于在configure()方法中完成绑定,可以在模块构造时手动传入Config实例——Play在启动过程中可以提前获取到配置:
第一步:修改模块类,添加带Config参数的构造函数
@Singleton public class DatastoreModule extends AbstractModule { private final Config config; public DatastoreModule(Config config) { this.config = config; } @Override public void configure() { MongoClient mongo = new MongoClient( config.getString("mongodb.host"), config.getInt("mongodb.port") ); Morphia morphia = new Morphia(); Datastore datastore = morphia.createDatastore( mongo, config.getString("mongodb.databaseName") ); bind(Datastore.class).toInstance(datastore); } }
第二步:在Play应用加载时传递Config
自定义ApplicationLoader来初始化模块并传入配置:
public class CustomApplicationLoader extends GuiceApplicationLoader { @Override protected GuiceApplicationBuilder builder(ApplicationLoader.Context context) { return super.builder(context) // 将Play上下文的Config传入模块 .modules(new DatastoreModule(context.config())); } }
最后在application.conf中指定这个自定义加载器:
play.application.loader = "com.yourpackage.CustomApplicationLoader"
这两种方法都完全依赖Play和Guice的原生机制,避免了使用废弃的API,同时保证了配置访问的正确性。
内容的提问来源于stack exchange,提问作者Marco Benetti
相关产品推荐
相关产品推荐

