本章将介绍基于 @Configuration 配置类来配置 com.mongodb.client.MongoClient 的实例,以及通过 MongoClientFactoryBean 容器去创建 com.mongodb.client.MongoClient 的实例。
以下示例显示了使用基于 Java 的 bean 元数据去注册 com.mongodb.client.MongoClient 的实例。例如:
(1)配置类
package com.hxstrive.springdata.mongodb.config;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置类
* @author hxstrive.com 2022/12/21
*/
@Configuration
public class BaseJavaConfig {
/**
* 使用标准的 Mongo 驱动 API 来创建一个 com.mongodb.client.MongoClient 实例
*/
@Bean
public MongoClient mongoClient() {
return MongoClients.create("mongodb://localhost:27017");
}
}(2)创建客户端类,验证 MongoClient 对象实例可用,如下:
package com.hxstrive.springdata.mongodb;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoIterable;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class BaseJavaConfigTest {
@Autowired
private MongoClient mongoClient;
@Test
void contextLoads() {
System.out.println("mongoClient=" + mongoClient);
MongoDatabase mongoDatabase = mongoClient.getDatabase("test");
// 获取 test 数据库中所有的集合名称
MongoIterable<String> mongoIterable = mongoDatabase.listCollectionNames();
for(String name : mongoIterable) {
System.out.println(name);
}
}
}运行示例,输出结果如下:
mongoClient=com.mongodb.client.internal.MongoClientImpl@4debbf0 inventory phrase test orders ex_entity_test ex_entity_test1 map_reduce_example users
在上一种方法中我们使用标准的 com.mongodb.client.MongoClient 实例,下面则介绍通过 Spring 的 MongoClientFactoryBean 容器来实例化 MongoClient。
与直接实例化 com.mongodb.client.MongoClient 实例相比,MongoClientFactoryBean 的优势在于它还为容器提供了 ExceptionTranslator 实现,该实现可将 MongoDB 异常转换为 Spring 的 DataAccessException 层次结构中的异常,用于有 @Repository 注解的数据访问类。
下面的例子显示了一个基于 Java 的 Bean 元数据的例子,它支持对拥有 @Repository 注解类进行异常转换。通过使用 Spring 的 MongoClientFactoryBean 注册 com.mongodb.client.MongoClient 对象,并启用 Spring 的异常转换支持。
(1)配置类
package com.hxstrive.springdata.mongodb.config;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoClientFactoryBean;
/**
* 配置类
* @author hxstrive.com 2022/12/21
*/
@Configuration
public class BaseJavaConfig {
/**
* 创建com.mongob.client.MongoClient实例的工厂Bean
*/
@Bean
public MongoClientFactoryBean mongoClientFactoryBean() {
MongoClientFactoryBean mongo = new MongoClientFactoryBean();
mongo.setHost("localhost");
return mongo;
}
}(2)创建客户端类,验证使用 MongoClientFactoryBean 对象创建 MongoClient 实例,如下:
package com.hxstrive.springdata.mongodb;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoIterable;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoClientFactoryBean;
@SpringBootTest
class BaseJavaFactoryBeanConfigTest {
@Autowired
@Qualifier("mongoClientFactoryBean")
private MongoClientFactoryBean mongoClientFactoryBean;
@Test
void contextLoads() throws Exception {
System.out.println("mongoClientFactoryBean=" + mongoClientFactoryBean);
MongoClient mongoClient = mongoClientFactoryBean.getObject();
if(null == mongoClient) {
System.err.println("mongoClient is NULL");
return;
}
MongoDatabase mongoDatabase = mongoClient.getDatabase("test");
// 获取 test 数据库中所有的集合名称
MongoIterable<String> mongoIterable = mongoDatabase.listCollectionNames();
for(String name : mongoIterable) {
System.out.println(name);
}
}
}运行客户端,输出如下:
mongoClientFactoryBean=org.springframework.data.mongodb.core.MongoClientFactoryBean@4eb9f2af inventory phrase test orders ex_entity_test ex_entity_test1 map_reduce_example users