liulisha丶 2024-12-23 12:56 采纳率: 22.2%
浏览 21

springboot 根据配置选择使用Mysql 或者mongodb

需求是我同时引入mysql 和mongodb 依赖,由于引入依赖后就需要在配置文件中指定两个中间件的配置信息
但是我的需求是,在配置中可配置选择使用哪种类型的存储
如果选择了mysql,则不会注册mongodb 的bean,也不会在配置文件中配置mongdb 连接相关配置

该怎么配置

  • 写回答

3条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2024-12-23 13:04
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    为了满足你的需求,我们可以使用Spring Boot的条件注解(如`@ConditionalOnProperty`)来根据配置文件中的属性值决定是否注册某个Bean。以下是一个详细的解决方案,包括配置文件、Java配置类以及必要的依赖。

    1. 添加依赖

    首先,在你的pom.xmlbuild.gradle文件中添加MySQL和MongoDB的依赖。

    Maven

    <dependencies>
        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
    
        <!-- MongoDB -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>
    

    Gradle

    dependencies {
        // MySQL
        implementation 'mysql:mysql-connector-java:8.0.23'
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    
        // MongoDB
        implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    }
    

    2. 配置文件

    application.ymlapplication.properties文件中,添加一个属性来选择存储类型,并根据选择的存储类型配置相应的数据库连接信息。

    application.yml

    # 选择存储类型
    storage.type: mysql  # 可选值:mysql, mongodb
    
    # MySQL 配置
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mydb
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
    
    # MongoDB 配置
      data:
        mongodb:
          uri: mongodb://localhost:27017/mydb
    

    3. Java配置类

    创建两个配置类,分别用于MySQL和MongoDB的配置,并使用@ConditionalOnProperty注解来根据配置文件中的属性值决定是否注册这些Bean。

    MySQL配置类

    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    import javax.sql.DataSource;
    
    @Configuration
    @ConditionalOnProperty(name = "storage.type", havingValue = "mysql")
    @EnableJpaRepositories(basePackages = "com.example.repo.mysql")
    public class MySQLConfig {
    
        @Bean
        public DataSource dataSource() {
            // 这里可以使用Spring Boot的自动配置,或者手动配置数据源
            return new org.springframework.jdbc.datasource.DriverManagerDataSource();
        }
    }
    

    MongoDB配置类

    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.mongodb.MongoDatabaseFactory;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
    
    @Configuration
    @ConditionalOnProperty(name = "storage.type", havingValue = "mongodb")
    public class MongoDBConfig {
    
        @Bean
        public MongoDatabaseFactory mongoDbFactory() {
            return new SimpleMongoClientDatabaseFactory("mongodb://localhost:27017/mydb");
        }
    
        @Bean
        public MongoTemplate mongoTemplate() {
            return new MongoTemplate(mongoDbFactory());
        }
    }
    

    4. 使用示例

    你可以在你的服务类中注入相应的Repository,并根据配置文件中的storage.type属性来决定使用哪个Repository。

    示例服务类

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import com.example.repo.mysql.MySQLUserRepository;
    import com.example.repo.mongodb.MongoDBUserRepository;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    
    @Service
    public class UserService {
    
        private final MySQLUserRepository mySQLUserRepository;
        private final MongoDBUserRepository mongoDBUserRepository;
    
        @Autowired
        public UserService(MySQLUserRepository mySQLUserRepository, MongoDBUserRepository mongoDBUserRepository) {
            this.mySQLUserRepository = mySQLUserRepository;
            this.mongoDBUserRepository = mongoDBUserRepository;
        }
    
        public void saveUser(User user) {
            if (mySQLUserRepository != null) {
                mySQLUserRepository.save(user);
            } else if (mongoDBUserRepository != null) {
                mongoDBUserRepository.save(user);
            }
        }
    }
    

    通过这种方式,你可以根据配置文件中的storage.type属性来决定使用哪种类型的存储,并且只有被选择的存储类型的Bean会被注册。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月23日