添加所需的依赖项
首先,您需要添加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
放置与特定相关的所有存储库的包。
部分文章内容可能来自互联网,如有侵权,请通过邮件联系
暂无评论内容