Spring MVC 3 + MongoDB - Parte 2

Em continuação ao Spring MVC 3  + MongoDB - Parte 1, vou me basear na utilização do DbFactoryBean do post Plain Simple MongoDB Spring Integration, com algumas observações adicionais.

Baixando o MongoDB

O MongoDB usado para escrever esse post foi OS X 64-bit - Versão 1.6.2, disponível na páginas de downloads do MongoDB.

Baixei e salvei no meu workspace.

$ /Users/pablo/workspace/mongodb-osx-x86_64-1.6.2/

Driver para o MongoDB

Eu não achei, mas também não procurei muito um repositório Maven para o driver do MongoDB, portanto eu simplesmente baixei o mongo-2.1.jar e salvei no diretório WEB-INF/lib.

mkdir workspace/spring-mongodb/src/main/webapp/WEB-INF/lib
cd workspace/spring-mongodb/src/main/webapp/WEB-INF/lib
wget http://github.com/downloads/mongodb/mongo-java-driver/mongo-2.1.jar

Após baixar e atualizar F5 o projeto no Eclipse.

Adicionando o mongo-2.1.jar no Build Path

Botão direito no projeto -> Propriedades -> Java Build Path -> Libraries -> Add JARs...

Configurando app-config.xml

Para configurar o app-config.xml, basta adicionar as seguintes linhas.

<bean id="propertiesPlacholder"
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
 lazy-init="false">
 <property name="location" value="classpath:/resources/app-config.properties" />
 </bean>

 <context:property-placeholder location="classpath:db.properties" />
 <bean id="mongo">
 <constructor-arg value="${db.host}" />
 <constructor-arg value="${db.port}" />
 </bean>
 <bean id="db">
 <property name="mongo" ref="mongo" />
 <property name="name" value="${app.db.name}" />
 </bean>

#app-config.properties

db.host=localhost
#porta default
db.port=27017
app.db.name=spring-mongodb-app

No post PropertyPlaceholderConfigurer – Usando properties nas configurações do Spring tem mais informações sobre Spring e arquivos properties.

Classe DbFactory

package com.cantero.spring_mongodb.dao;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.util.Assert;

import com.mongodb.DB;
import com.mongodb.Mongo;

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;
 }

}

Relembrando Factory

Factory Method e Abstract Factory são listados no GoF como patterns creacionais, que lidam com a instanciação de objetos.

Factory Method provê uma classe de decisão, na qual retorna uma das muitas possíveis subclasses de uma classe base abstrata, dependendo do dado fornecido.

CarroAbstract carro = CarroFactory.get("Vectra");

Abstract Factory provê uma interface para se criar e retornar uma de muitas famílias de objetos relacionados.

FabricaAbstract fabrica = AbstractFabricaFactory.getInstance("Chevrolet");
CarroAbstract carro = fabrica.get("Vectra");

Singleton/Prototype

O FactoryBean pode ser Spring Singleton (uma única instância para todas as requisições) ou Spring Prototype (uma nova instancia para cada requisição), lembrando que apesar do nome, são implementações essecialmente iguais, mas implementadas de forma diferente do que os respectivos patterns no GoF.

Singleton é o escopo padrão para criação de Beans no Spring, que pode ser alterado na declaração do Bean.

Voltando... BaseDAOImpl

<bean id="baseDAOImpl" class="com.cantero.spring_mongodb.dao.BaseDAOImpl">
 <property name="db" ref="dbFactory"/>
</bean>

#BaseDAOImpl.java

package com.cantero.spring_mongodb.dao;

import com.mongodb.DB;

public class BaseDAOImpl implements IBaseDAO {

 //private Logger logger = org.slf4j.LoggerFactory
 //        .getLogger(BaseDAOImpl.class);

 protected DB db;

 public void setDb(DB db) {
 this.db = db;
 }

 protected DB getDb() {
 return db;
 }
}

Utilizado o BaseDAOImpl nos Services

package com.cantero.spring_mongodb.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.cantero.spring_mongodb.dao.IBaseDAO;

@Service
public class PessoaServiceImpl implements IPessoaService {

 @Autowired
 IBaseDAO baseDAO;

}

No Controller

package com.cantero.spring_mongodb.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.cantero.spring_mongodb.service.IPessoaService;

@Controller
public class PessoaController {

 @Autowired
 IPessoaService pessoaService;

}

Iniciando o MongoDB

A primeira vez que for iniciar o MongoDB lembre-se de criar o diretório /data/db

$ mkdir /data/db
$ cd workspace/mongodb-osx-x86_64-1.6.2/bin/
$ ./mongod

Continuará...