Plain Simple MongoDB Spring Integration
You know what is MongoDB and what is Spring Framework and want to use the first inside the second? Here's short plain and simple integration between the two:
- Properties file with server and database details (resides in classpath in this example):
db.host=localhost
db.port=27017
app.db.name=app
- If you don't use Java-based container configuration (you should start using it!):
- application-config.xml (or whatever you call it):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:property-placeholder
location="classpath:db.properties"/>
<bean id="mongo" class="com.mongodb.Mongo">
<constructor-arg value="${db.host}"/>
<constructor-arg value="${db.port}"/>
</bean>
<bean id="db"
class="com.mongodb.spring.config.DbFactoryBean">
<property name="mongo" ref="mongo"/>
<property name="name" value="${app.db.name}"/>
</bean>
</beans> - The com.mongodb.spring.config.DbFactoryBean class:
public class DbFactoryBean implements FactoryBean<DB> {
private Mongo mongo;
private String name;
@Override
public DB getObject() throws Exception {
Assert.notNull(mongo);
Assert.notNull(name);
return mongo.getDB(name);
}
@Override
public Class<?> getObjectType() {
return DB.class;
}
@Override
public boolean isSingleton() {
return true;
}
@Required
public void setMongo(Mongo mongo) {
this.mongo = mongo;
}
@Required
public void setName(String name) {
this.name = name;
}
}
- If you do use Java-based container configuration - here's your @Configuration class:
@Configuration
public class ApplicationConfiguration {
@Value("${app.db.name}")
private String appDbName;
@Value("${db.host}")
private String dbHost;
@Value("${db.port}")
private int dbPort;
@Bean
public DB db() throws UnknownHostException {
return mongo().getDB(appDbName);
}
@Bean
public Mongo mongo() throws UnknownHostException {
return new Mongo(dbHost, dbPort);
}
}
That's, actually, it - enjoy. If you feel some part of the puzzle is missing, please leave a comment.
This post was originally posted in my blog - http://jbaruch.wordpress.com
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)






Comments
Steve Keylin replied on Sun, 2010/05/30 - 4:03pm
Andy Jefferson replied on Mon, 2010/05/31 - 3:59am
And you could take it further and use JPA/JDO with MongoDB using
http://code.google.com/p/datanucleus-store-mongodb/
Baruch Sadogursky replied on Mon, 2010/05/31 - 5:01am
in response to:
Andy Jefferson
Manuel Jordan replied on Mon, 2010/05/31 - 2:35pm
BTW guys, Apress are in process to publish a book about Mongo http://www.apress.com/book/view/1430230517
-Manuel
Andy Jefferson replied on Mon, 2010/05/31 - 2:58pm
in response to:
Baruch Sadogursky
Which part of JDO is "relational" exactly ? It was designed as datastore agnostic. Calling pm.makePersistent() is about as agnostic as it can get. For this exact reason, many OODBMS offer it as an API to their products
Baruch Sadogursky replied on Tue, 2010/06/01 - 2:21am
in response to:
Andy Jefferson