Spring4.1与mongo集成解决方案

mongodb这块现在开始流行起来了,最近公司要求使用mongodb搞一个统计类型的项目,需要先熟悉Java的mongodb驱动程序,当然为了提高效率,我并没有选择看mongo驱动API的操作,而是看Spring如何继承mongo驱动。

切入正题创建集成Spring项目

  • 第一个问题:选择Spring的版本?

为了更上主流节奏建议选择较高版本的Spring,这里我们就选择spring 4.1。

  • 第二个问题:Spring项目改版?

Spring目前已经采用了maven和Gradle构建工具发布其jar包了,也就是说我们要使用其项目中的jar文件,需要学习Maven构建工具。
那么,如何学习,怎么开始?这个就成了我们的问题!解决方案使用MyEclipse集成了Maven eclipse插件,操作方便。

  • 第三个问题:创建Maven项目

在myeclipse创建项目是有选项的,因此不多解释,按照步骤来就行了,值得注意的是Maven项目的参数

Maven项目

Group Id: 这个是项目组ID
Artifact Id:项目名称一般为英文
Version: 版本
Archetype:意思就是选择一个模板Maven项目方便开发,当然这个需要下载相关的jar包的,速度比较慢。

注意:项目创建好了报错就是有问题的,必须要解决不然无法pom.xml修改了也没用。

配置pom.xml

那么我这里直接贴上我的pom代码

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>mongodb-qooco</groupId>
  <artifactId>mongodb-qooco11</artifactId>
  <version>0.0.1</version>
  <packaging>war</packaging>
  <build>
    <defaultGoal>compile</defaultGoal>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.10</version>
          <configuration>
            <includes>
              <include>**/*Test.java</include>
            </includes>
          </configuration>
        </plugin>

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
            <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <warSourceDirectory>WebRoot</warSourceDirectory>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
  <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.6.RELEASE</version>
        <scope>runtime</scope>
        <!-- Spring4 抛弃了JCL,使用SLF4J -->
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
  <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.2</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-jdk14</artifactId>
        <version>1.6.2</version>
    </dependency>

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>


    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.20</version>
    </dependency>

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-lgpl</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-lgpl</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>1.5.4.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.8</version>
    </dependency>
  </dependencies>
    <repositories>
  <repository>
        <id>sourceforge</id>
        <url>http://oss.sonatype.org/content/groups/sourceforge/</url>
        <releases>
          <enabled>true</enabled>
        </releases>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
      </repository>
    </repositories>
</project>

Spring数据配置文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        http://www.springframework.org/schema/jee
        http://www.springframework.org/schema/jee/spring-jee-4.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/schema/util
        http://www.springframework.org/schema/schema/util/spring-util-4.1.xsd
        http://www.springframework.org/schema/data/mongo
        http://www.springframework.org/schema/data/mongo/spring-mongo-1.5.xsd
        ">

    <context:annotation-config />


    <!-- 提供该PropertyPlaceholderConfigurer bean支持把properties文件中的信息读取到XML配置文件的表达式中 -->
    <!-- 从Spring2.5开始引入命名空间配置加载properties文件到XML -->
    <context:property-placeholder location="classpath:/config/database/mongodb.properties" />

    <!-- 通过工厂Bean创建mongo连接实例,没有密码就把username和password属性删除了-->
    <mongo:db-factory host="${db.host}" port="${db.port}" dbname="${db.database}"
            username="${db.username}" password="${db.password}"   />


    <!-- mongo模板操作对象 -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
    </bean>

    <!-- MongoDB GridFS Template 支持,操作mongodb存放的文件 -->
    <mongo:mapping-converter id="converter" db-factory-ref="mongoDbFactory"/>
    <bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
      <constructor-arg ref="mongoDbFactory"/>
      <constructor-arg ref="converter"/>
    </bean>


    <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!-- 扫描实现 -->
    <context:component-scan base-package="com.qooco.mongo.impl" />



</beans>

Properties文件mongodb.properties

db.host=localhost
db.port=27017
db.database=admin
db.username=marker
db.password=123

单元测试代码

package test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.qooco.domain.Customer;




/**
 * 单元测试
 * @author marker
 * @version 1.0
 * @blog www.yl-blog.com
 * @weibo http://t.qq.com/wuweiit
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/config/spring/*.xml")
public class MongoTemplateTest {


    @Autowired private MongoTemplate mongo;


    @Test
    public void test(){
        Customer c = new Customer();
        c.setFirstName("wu");
        c.setLastName("wei");
        mongo.insert(c); 
    }
}

Customer类

package com.qooco.domain;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

// 注意这里的注解哦,简单看看mongodb的文档就知道这个是文档集合
@Document(collection="customer")
public class Customer {

    @Id
    private String id;

    private String firstName;
    private String lastName;

    public Customer() {}

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return String.format(
                "Customer[id=%s, firstName=&#039;%s&#039;, lastName=&#039;%s&#039;]",
                id, firstName, lastName);
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}

使用什么工具管理mongodb

这里我推荐大家使用MongoVUE,可以负责任的告诉你,这个是付费的,但是有破解方法。

mongodb管理工具MongoVUE

总结

在mongo项目与Sping集成时候尽量避免自己动手集成因为mongo API的更新比较大,很多时候各个版本之间的兼容性极差,导致项目一直不能构建出来。
特别是Spring Data项目中的mongodb模块的更新,导致了某些Spring配置就不一样,因此在我们自己网上找到代码配置的时候就出现问题了,最好的解决办法就是将xsd加载xml头部,这样可以让看到Spring的xml配置文件支持那些元素。

这里举个例子,在某些博客上的Spring mongo配置:

<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
    <constructor-arg ref="mongo"/>
    <constructor-arg name="databaseName" value="db"/>
    <constructor-arg name="defaultCollectionName" value="person" />
</bean>
完全可以看到这个bean中的class属性不一样了,因此这个也是版本问题,因为Maven帮我们管理的依赖,比如我使用了Spring Data mongo版本,那么他会自动寻找依赖的mongo版本下载,这也是Maven项目的好处之一。
来源: 雨林博客(www.yl-blog.com)