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项目的参数
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='%s', lastName='%s']",
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,可以负责任的告诉你,这个是付费的,但是有破解方法。
总结
在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项目的好处之一。