本章将介绍基于 @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