嗯。两天前我遇到了这个问题。并且由于对此事进行了研究。我正在寻找一种解决方案,使我能够运行具有不同配置文件的应用程序,这些配置文件作为应用程序运行时的系统属性传递,例如:
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));
}
如果系统属性不包含我要查找的属性,那么我
创建我的组件的 PRODUCTION 实例(配置为使用生产模块):
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 实现相比,这种方法肯定需要大量样板代码,但这是我能够想出的唯一可行的方法。
希望对你有帮助。