我是 dagger 的新手,我正在寻找如何在 dagger-2.x 中实现 spring 配置文件等功能。我想为我的开发环境和生产环境使用不同的 bean,但我使用的是带有 Java 的 Dagger 框架。
@Provides
@Singleton
public void providesDaggerCoffeeShopClient(Stage stage) {
DaggerCoffeeShop.builder()
.dripCoffeeModule(new DripCoffeeModule())
.qualifier(stage)
.build();
}
在这里,如果阶段是“Devo”,我想跳过这个 bean 创建。任何帮助将不胜感激。
最佳答案
嗯。我2天前遇到过这个问题。并且自从对此事进行了研究。我一直在寻找一种解决方案,使我能够运行具有不同配置文件的应用程序作为系统属性在应用程序运行时传递,例如:
java -Denv=local-dev-env -jar java-app.jar
我能找到的唯一合适的解决方案是遵循官方文档测试指南: https://dagger.dev/dev-guide/testing 并将我的一个模块分成不同的模块,特别是当我想在本地运行我的应用程序时,我必须分离和替换数据库依赖性,避免连接到真实数据库并针对真实数据库执行任何命令。 当我运行我的应用程序时,我会检查系统属性,例如:
public boolean isLocalDevEnv() {
return Environments.LOCAL_DEV.envName.equals(System.getProperty("env", Environments.PRODUCTION.envName));
}
如果系统属性不包含我正在寻找的属性,那么我 创建我的组件的生产实例(配置为使用生产模块):
DaggerMyAppComponent.create()
大概是这样的:
@Component(modules = {MyAppModule.class, DaoModule.class})
@Singleton
public interface MyAppComponent {...}
否则,我创建组件的 loca-dev-env 版本,该版本使用生成 Dao 模拟的模块版本,否则将创建与真实数据库的真实连接:
DaggerMyAppLocalDevEnvComponent.create()
大概是这样的:
@Component(modules = {MyAppModule.class, DaoMockModule.class})
@Singleton
public interface MyAppLocalDevEnvComponent {...}
希望它很清楚,所以从系统属性和编程决策的角度考虑 dagger 2 的 Spring Profiles。与 Spring 的 Profiles 实现相比,这种方法肯定需要大量样板代码,但这是我能够想到的唯一可行的方法。
希望对您有所帮助。
关于dagger-2 - 配置文件在 Dagger ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64203683/