如何在 Spring Boot 中配置多个 MongoDB 连接

添加所需的依赖项

首先,您需要添加spring-boot-starter-data-mongodb项目的依赖项。至少使用 2.3.0 版本,因为Spring Boot Starter Data MongoDB 2.3.0.RELEASE中引入了 MongoDB Driver 4.x。

如果您是 Gradle 用户,请将此依赖项添加到项目的构建文件中:

compile "org.springframework.boot:spring-boot-starter-data-mongodb:2.3.0.RELEASE"

否则,如果您是 Maven 用户,请将以下依赖项添加到项目的构建 POM 中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.3.0.RELEASE</version>
</dependency>

现在,您已具备在 Spring Boot 中使用 MongoDB 所需的一切。

定义多个MongoTemplate实例

如果您已经有多个MongoTemplates,但想升级到 Spring Data MongoDB 3.x,我建议您首先阅读文档。否则,您可以按照以下几个步骤从头开始。

首先,您需要在application.properties文件中定义所有 MongoDB 连接详细信息。

MongoDB 4.x 驱动程序不再支持host和配置,因此您需要使用单个 URI 来提供以下格式的所有必需配置:port

mongodb://<username>:<password>@<host>:<port>/<db_name>

请注意,这<username>:<password>@是可选的,您应该仅将其用于经过身份验证的连接。

所以,你application.properties应该包含这样的内容:

#--- Primary MongoDB ---#
spring.data.mongodb.uri=mongodb://admin:[email protected]:27017/primary
#--- Secondary MongoDB ---#
mongodb.uri=mongodb://admin:[email protected]:27017/secondary

现在,是时候添加一个新的 Spring Boot 配置文件,您将在其中为每个连接定义一个Spring Boot bean :MongoTemplate

@Configuration
class MultipleMongoConfig {
    @Primary
    @Bean(name = ["primaryMongoProperties"])
    @ConfigurationProperties(prefix = "spring.data.mongodb")
    fun getPrimary() : MongoProperties {
        return MongoProperties()
    }

    @Bean(name = ["secondaryMongoProperties"])
    @ConfigurationProperties(prefix = "mongodb")
    fun getSecondary() : MongoProperties {
        return MongoProperties()
    }

    @Primary
    @Bean(name = ["primaryMongoTemplate"])
    fun primaryMongoTemplate() : MongoTemplate {
        return MongoTemplate(primaryMongoDatabaseFactory(getPrimary()))
    }

    @Bean(name = ["secondaryMongoTemplate"])
    fun secondaryMongoTemplate() : MongoTemplate {
        return MongoTemplate(secondaryMongoDatabaseFactory(getSecondary()))
    }

    @Primary
    @Bean
    fun primaryMongoDatabaseFactory(mongo : MongoProperties) : MongoDatabaseFactory {
        return SimpleMongoClientDatabaseFactory(
            mongo.uri
        )
    }

    @Bean
    fun secondaryMongoDatabaseFactory(mongo : MongoProperties) : MongoDatabaseFactory {
        return SimpleMongoClientDatabaseFactory(
            mongo.uri
        )
    }
}

@ConfigurationProperties注释适用于所有具有在配置文件中定义的相同前缀的分层属性。

Spring Boot 将自动绑定application.properties文件中定义的任何具有注释中声明的前缀且与目标类中的字段之一同名的属性。这意味着对象uri的字段MongoProperties将具有从配置文件中读取的值。

实例MongoProperties用于建立与数据库的连接SimpleMongoClientDatabaseFactory,然后创建所需的MongoTemplate实例。

该类MongoTemplate是该接口的主要实现MongoOperations,并提供一组基本的 MongoDB 操作。您可以使用MongoTemplate对象进行聚合、排序,并根据其引用的数据库中的多个条件查找所需的文档。

最后,您必须禁用 Mongo 的 Spring Boot 自动配置。您可以通过在 Spring Boot 应用程序的主类顶部添加以下代码行来实现此目的:

@SpringBootApplication(exclude = [
   MongoAutoConfiguration::class,
   MongoDataAutoConfiguration::class
])

使用MongoTemplate实例

MongoTemplate直接 使用

MongoTemplate为底层持久化引擎提供基本的 API,可用于执行查询。以这种方式使用它所需要的只是一个工作实例。

假设您要检索保存在authors按特定姓氏放置在辅助 MongoDB 数据库中的集合中的所有作者。

现在,您需要一个Author带有注释的类,@Document表示存储在集合中的文档:

@Document(collection = "author")
class Author {
    @get:Id
    @get:Field("_id")
    var id: String? = null

    @get:Field("name")
    var name: String? = null

    @get:Field("surname")
    var surname: String? = null
}

然后,在DAO图层类中,您可以定义检索逻辑,如下所示:

@Repository
class AuthorDao {
    @Autowired
    @Qualifier("secondaryMongoTemplate")
    protected lateinit var secondaryMongoTemplate : MongoTemplate

    fun findBySurname(surname): List<Author> {
        val query = Query()

       query.addCriteria(
           Criteria.where("surname").`is`(surname)
       )
       return secondaryMongoTemplate.find(query, Author::class.java)
    }
}

请注意,需要注释才能按名称@Qualifier选择所需的实例。如果没有它,Spring Boot 将选择中定义的对象,因为它标有.MongoTemplateBeanprimaryMongoTemplateMultipleMongoConfig@Primary

瞧!不需要其他代码行。

使用MongoTemplate通过MongoRepository

存储库是Spring Data的主要概念之一,也是一种通过避免样板代码来减少实现数据访问层工作量的方法。为了进一步阅读,我推荐文档。

的实现类在运行时MongoRepository利用一个MongoTemplate实例。

要指定MongoTemplate必须使用哪个 bean,您需要额外的配置。特别是,您必须@Configuration为每个MongoTemplate实例定义一个新文件。

这是启用存储库的配置文件的样子primaryMongoTemplate

@Configuration
@EnableMongoRepositories(
    basePackages = ["com.example.yourproject.primary.repositories"],
    mongoTemplateRef = "primaryMongoTemplate"
)
class PrimaryMongoDBRepositoryConfig

这就是使存储库能够使用的配置文件secondaryMongoTemplate的样子:

@Configuration
@EnableMongoRepositories(
    basePackages = ["com.example.yourproject.secondary.repositories"],
    mongoTemplateRef = "secondaryMongoTemplate"
)
class SecondarMongoDBRepositoryConfig

请注意,basePackages必须指向mongoTemplateRef放置与特定相关的所有存储库的包。

© 版权声明
THE END
喜欢就支持一下吧
点赞0打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容