Crear un singleton HFactory
Quitar las dependencias del SF de spring
Instanciar el SessionFactory cuando se ocupe
public class HFactory {
private static HFactory instance;
private SessionFactory sf;
//Constante de el directorio donde estan los mapeos
private static final String DONDE = "mx.edu.itsur.ds.mapping";
//Constructor privado para evitar instanciacion
private HFactory() {
//Configuramos entonces el sf
Configuration cfg = new Configuration();
/*Mi vida: Capitulo 1...
Hace mucho tiempo, en un lugar muy, muy lejano, nacio un lindo niño
que vino a iluminar con su nacimiento a este triste y aburrido mundo */
try {
//Usamos las librerias de spring para acceder a los recursos locales
Resource r = new ClassPathResource(DONDE);
File f = r.getFile();
File[] fs = f.listFiles();
//Checamos cuales tienen extension XML y los agregamos a la configuracion
for(int i = 0; i < fs.length; i++) {
String nombre = fs[i].getName();
if(nombre.indexOf(".xml") == nombre.length - 4)
cfg.addResource(CODE + "/" + nombre);
}
//Obtenemos nuestro nuevo SF
this.sf = cfg.buildSessionFactory();
} catch(Exception e) { e.printStackTrace(); }
}
//Singleton
public static HFactory getInstance() {
if(instance == null)
instance = new HFactory();
return instance;
}
//Devolvemos un SF para otros objetos
public static SessionFactory getSF() {
return getInstance().sf;
}
}
Después de esto vamos a eliminar la linea que incluye al hibernate.xml
del archivo applicationContext.xml; eso obviamente va a causar un buen de problemas
con todos los DAOS y la aplicación se va a parar si estaba funcionando. En cada uno de los archivos que incluye el applicationContext.xml vamos a quitar todas
las referencias al objeto sf que se define en el archivo hibernate.xml
OK, ahora todo dejo de funcionar porque los objetos DAO no tienen un SF para funcionar, vamos a hacer uso de la hermosa herencia para crear esta dependencia desde el momento en que se crea el objeto DAO. Supongamos que tenemos una clase HibernateDAO que es la base de todos los daos...
public class HibernateDAO implements BasicDAO {
//Vamos a cambiar solamente el constructor
public HibernateDAO(String clase) {
//Esta linea antes de las operaciones normales de creacion
sf = HFactory.getSF();
//Y todo lo que ya tenia el DAO
}
}
Con esta solución el dependency injection se realiza desde HibernateDAO y todas las clases que extiendan de el tienen la vida resuelta. Con esto ya mi servidor no se ha parado.