首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有条件地自动连接Spring数据存储库

有条件地自动连接Spring数据存储库
EN

Stack Overflow用户
提问于 2019-10-30 17:46:42
回答 2查看 1.2K关注 0票数 4

我有一个REST API项目,它使用多个后端(打包在不同的jars中)。我在java配置类中使用@ConditionalOnProperty来定义要配置的后端。假设有一个后端,其中包含一个关系数据库和一个MongoDB Spring Data后端jar。如果项目部署在mysql数据库环境中,则应使用第一个后端。项目应该是预先构建的,并且在部署之前只会更改application.properties文件中的一个属性。

有没有办法有条件地自动创建相应的存储库?例如,在Spring Service类中,我将拥有如下内容:

代码语言:javascript
复制
@Service
public class MyService {

@Autowired
private UserMySqlRepository repo1;

@Autowired
private UserMongoDBRepository repo2;

}

UserMySqlRepository将扩展JpaRepository,UserMongoDBRepository将扩展MongoDbRepository。是否可以使用@Conditional注释这些字段,并仅在使用相应配置时自动绑定它们?如果不是,哪种方法是最好的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-30 17:54:15

是!您可以实现策略设计模式。使您的Repository类具有公共接口,以便返回类型保持不变。在配置文件中定义bean方法,以便检查配置了哪个数据库并相应地返回对象。

代码语言:javascript
复制
interface UserRepository {
//...
}

interface UserMySqlRepository extends UserRepository {
//...
}

interface UserMongoDBRepository extends UserRepository {
//...
}

@Configuration
class DbBeansConfig{

@Bean
public UserRepository getUserRepository(){

  if(mysql configured){// give your impl here
     return new UserMySqlRepository(); // your bean here
   }else{
      return new UserMongoDBRepository (); // your bean here
   }
 }
}
票数 4
EN

Stack Overflow用户

发布于 2019-10-30 17:54:45

我们可以使用属性havingValue来指定必须匹配的usemysql属性的某些值。如果usemysql属性设置为dataSource,那么让我们使用默认值来定义连接到名为myDb的本地数据库的本地bean:

代码语言:javascript
复制
@Bean
@ConditionalOnProperty(
  name = "usemysql", 
  havingValue = "local")
@ConditionalOnMissingBean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true");
    dataSource.setUsername("mysqluser");
    dataSource.setPassword("mysqlpass");

    return dataSource;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58622548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档