设为首页 收藏本站
查看: 1272|回复: 0

[经验分享] 【原】Spring与MongoDB集成:配置

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-7-7 08:20:28 | 显示全部楼层 |阅读模式
  MongoDB的API提供了DBObject接口来实现BSONObject的操作方法,BasicDBObject是具体实现。但是并没有提供DBObjectBeanObject的转换。在还没有了解到与spring集成之前,我做了一个简单的转换,要通过映射和动态调用实现两个对象的存取。
  代码要处理Bean中的各种类型,并且要控制持久化时的深度:


  • 基础类型(int, float, boolean...)
  • 基础扩展类型(Integer, Float, Boolean)
  • 枚举
  • ObjectId
  • 普通对象 extends Object
  • 业务对象(拥有ObjectId的对象)
  • 容器List, Map, Set(处理元素时要把上面的类型再处理一遍)
  虽然代码可以运行并能达到预期,但知道spring-data-mongo这样现成的集成功能包时,还是决定换过来。
  spring-data-mongo的实现中有一处和我的实现是相似的,就是在mongodb中元素包含了类型信息来做反序列化,我的实现里用_classname来保存类型信息。
  
  本文只讨论Spring与MongoDB集成的配置,不包括如何使用Mongo、MongoTemplate实例等内容。
  spring-data-mongo提供了MongoTemplate来操作bean对象与MongoDB交互,在使用前的关键是如何创建一个MongoTemplate来使用。
  
  1、依赖包
  spring与mongo集成需要很多包,可以手工下载或在运行时通过异常信息下载对应的包,很繁琐,建议使用Maven来管理依赖。
  要加入的依赖有两个:spring-data-mongo和slf4j的实现,这里选的是slf4j-log4j12。如果不加载slf4j-log4j12,也可以使用其它slf4j的实现,看具体需要。没有加载的话,运行时会提示错误:



SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
  把下面的依赖加到pom.xml中的节点中




org.springframework.data
spring-data-mongodb
1.2.1.RELEASE


org.slf4j
slf4j-log4j12
1.7.5

  在pom.xml指定使用的spring版本:



3.1.2.RELEASE
  增加spring里程碑仓库到pom.xml中





spring-milestone
Spring Maven MILESTONE Repository
http://repo.springsource.org/libs-milestone


  
  2、集成(连接到MongoDB)
  Spring和MongoDB的集成有四种方式,核心就是如何取得MongoTemplate,以及如何设置mongo连接参数,而最终连接到MongoDB上。
  1、基本方式
    直接创建MongoTemplate,指定连接时的name,password,database参数等等。这种方式最直接,不需要配置,只要载入相关的jar包。
    MongoTemplate有两个参数,第一个是com.mongodb.Mongo实例,第二个是字符串型的数据库名。
    数据库名不需要解释了,对于第一个参数,可以直接new Mongo(),并给构造函数传入适当的参数:



@Configuration
public class AppConfig {
public @Bean
Mongo mongo() throws UnknownHostException {
return new Mongo( "localhost" );
}
}
     或者使用MongoFactoryBean创建Mongo实例



@Configuration
public class AppConfig {
public @Bean
MongoFactoryBean mongo() {
MongoFactoryBean mongo = new MongoFactoryBean();
mongo.setHost( "localhost" );
return mongo;
}
}
    无论怎样,都是手工配置。
  2、使用XML注册Mongo的实例
    使用(Spring)XML注册Mongo实例的好处是可以方便的配置Mongo参数,还可以简单的配置集群信息。








    如果要配置连接参数可以下面的代码:








    配置集群信息:




    上面两种方法是围绕如何直接创建出Mongo实例,而接下来的方法是使用MongoDBFactory来创建DB实例。
  3、使用MongoDBFactory
    MongoTemplate的另一组重要构造方法中,有一个是必须的:MongoDBFactory,这是一个接口,定义返回DB实例的方法:



public interface MongoDbFactory {
DB getDb() throws DataAccessException;
DB getDb(String dbName) throws DataAccessException;
}
    你可以自己实现这个接口,创建Mongo实例,再返回DB的实例。
    spring提供了一个基本的类:org.springframework.data.mongodb.core.SimpleMongoDbFactory,是MongoDbFactory的简单实现。
    这个类以Mongo实例为参数,可以设置数据库名作为第二个可选参数;如果有更多的配置项,就使用UserCredentials参数作为第三个可选参数。
    使用下面这段代码来创建MongoTemplate。里面的SimpleMongoDBFactory和Mongo实例可以手工创建,也可以通过Ico容器来实现。



public class MongoApp {
private static final Log log = LogFactory.getLog( MongoApp.class );
public static void main( String[] args ) throws Exception {
MongoOperations mongoOps = new MongoTemplate( new SimpleMongoDbFactory( new Mongo(), "database" ) );
mongoOps.insert( new Person( "Joe", 34 ) );
log.info( mongoOps.findOne( new Query( where( "name" ).is( "Joe" ) ), Person.class ) );
mongoOps.dropCollection( "person" );
}
}
    如果使用Bean来配置SimpleMongoDbFactory,代码大概是这样:



@Configuration
public class MongoConfiguration {
public @Bean
MongoDbFactory mongoDbFactory() throws Exception {
return new SimpleMongoDbFactory( new Mongo(), "database" );
}
}
    如果要配置用户名和密码,要使用UserCredentials类,向SimpleMongoDbFactory的构造方法传递Mongo连接的配置信息:



@Configuration
public class MongoConfiguration {
public @Bean
MongoDbFactory mongoDbFactory() throws Exception {
UserCredentials userCredentials = new UserCredentials( "joe", "secret" );
return new SimpleMongoDbFactory( new Mongo(), "database", userCredentials );
}
public @Bean
MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate( mongoDbFactory() );
}
}
  4、使用XML配置MongoDbFactory实例
    这种方法把所有的配置项放到独立的配置文件中,使用比较灵活,基本不需要代码来维护与Mongo连接有关的功能。
    用如下代码在节点下简单配置:




    或者,配置连接信息:




    一个项目中的spring配置文件内容会比较多,经常修改XML文件并不是一个好办法。spring提供了另一个方法,可以独立加载一个properties文件,在个文件里是MongoDB的配置参数。
    通过节点配置mongo.properties的位置:











    节点的location属性配置成自己项目中的mongo.properties位置。我的配置文件如下:



mongo.host=127.0.0.1
mongo.port=27017
mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
mongo.connectTimeout=1500
mongo.maxWaitTime=1500
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=1500
mongo.slaveOk=true
    然后,在代码中获取到MongoTemplate的实例:



MongoOperations mongoOps = (MongoTemplate) context.getBean( "anotherMongoTemplate" );
    回头看看上面XML的配置:


  • 配置mongo.properties的位置
  • 配置如何创建Mongo实例,使用了(1)的配置
  • 配置如何创建MongoDbFactory,使用了(2)的配置
  • 配置MongoTemplate,使用了(3)的配置
    所以,配置spring与mongodb集成的重点是如何创建MongoTemplate实例。
  

  参考:
  spring-data-mongo: http://www.springsource.org/spring-data/mongodb

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83921-1-1.html 上篇帖子: Mongodb在NUMA机器上的优化 下篇帖子: (转)MongoDB实战开发 【零基础学习,附完整Asp.net示例】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表