是否可以基于application.properties注入不同的存储库类?

时间:2017-08-26 15:35:01

标签: java spring-boot dependency-injection

我有 MySql Mongo 数据库的不同属性文件,它们是在启动时根据maven配置文件加载的。

对于mongo,还需要注入另一个存储库: MongoRepository 而不是 CrudRepository ,因为它适用于MySQL。

是否可以使用 application.properties 中的属性来解决此问题,并基于此属性注入一个或另一个存储库?

我的应用程序是一个简单的spring-boot应用程序,存储库是从控制器注入的。

2 个答案:

答案 0 :(得分:0)

我假设两个存储库都有一个通用接口,您希望加载实际的bean。我尝试过这样的事情:(我没有测试过它)

@Autowired
MongoRepository mongoRepository;
@Autowired
CrudRepository crudRepository;

@Value("isMongo")
boolean isMongo;

private Repository actualRepository;

 @PostConstruct
  public void init() {
    actualRepository = isMongo ? mongoRepository : crudRepository;
  }

如果你需要在其他几个bean中使用这个存储库,你甚至可以创建一个bean:

@Bean
public Repository actualRepository(@Value("isMongo") boolean isMongo, MongoRepository mongoRepository, CrudRepository crudRepository) {
  isMongo ? mongoRepository : crudRepository;
}

答案 1 :(得分:0)

是的,这是非常可行的。在Spring Boot中,您可以通过profiles执行此操作。使用配置文件,您可以启用或停用@Repository(以及其他@Components)。

@Repository
@Profile("mongo")
public interface MyMongoRepo extends MongoRepository<SomeObject, String> {

}


@Repository
@Profile("mysql")
public interface MyMysqlRepo extends CrudRepository<SomeObject, String> {

}

显然,您可以使用您想要的任何个人资料名称。可以通过命令行或application.properties文件设置配置文件。

spring.profiles.active=mysql