Mostrando entradas con la etiqueta Spring. Mostrar todas las entradas
Mostrando entradas con la etiqueta Spring. Mostrar todas las entradas

martes, 3 de noviembre de 2009

Integración Spring y Hibernate (1)

La integracion de Hibernate con Spring es muy sencilla, se puede hacer de varias formas. Aquí vamos a ver la primera y mas simple.

Creamos una tabla Persona con la siguiente estructura

CREATE TABLE PERSONA (
NOMBRE VARCHAR(10),
APELLIDOP VARCHAR(20),
EDAD INTEGER
);

La estructura de este ejemplo es



Para obtener un sessionFactory usamos la clase HibernateUtil.java que se define como sigue

package org.dracof.hibernate.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
sessionFactory =
new Configuration().configure().buildSessionFactory();
}

public static SessionFactory getSessionFactory () {
return sessionFactory;
}
}

El mapeo de hibernate (Persona.hbml.xml) con la tabla Persona se realiza como sigue

<hibernate-mapping>
<class name="org.dracof.hibernate.Persona" table="PERSONA">
<id name="nombre" column="NOMBRE">
<generator class="assigned"/>
</id>
<property name="apellidoP" column="APELLIDOP"/>
<property name="edad" column="EDAD"/>
</class>
</hibernate-mapping>

Se crea el POJO para este mapeo

public class Persona {

private String nombre;

private String apellidoP;

private Integer edad;

//setters y getters
...
}

Definimos la interface para el DAO

package org.dracof.hibernate.dao;

import org.dracof.hibernate.Persona;

public interface PersonaDAO {

public void creaPersona (Persona persona);

public Persona obtienePersona (String nombre);

public void eliminaPersona (String nombre);
}

Y su implementacion

package org.dracof.hibernate.dao.impl;

import org.dracof.hibernate.Persona;
import org.dracof.hibernate.dao.PersonaDAO;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class PersonaDAOImpl implements PersonaDAO {

private SessionFactory sessionFactory;

public void setSessionFactory (SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public void creaPersona (Persona persona) {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(persona);
session.getTransaction().commit();
}

public Persona obtienePersona (String nombre) {
Session session = sessionFactory.getCurrentSession();

session.beginTransaction();
Persona persona = (Persona)session.get(Persona.class, nombre);
session.getTransaction().commit();

return persona;
}

public void eliminaPersona (String nombre) {
Persona persona = new Persona();
persona.setNombre(nombre);

Session session = sessionFactory.getCurrentSession();

session.beginTransaction();
session.delete(persona);
session.getTransaction().commit();
}
}

En este caso vemos que se le inyecta el sessionFactory con Spring.

El XML de configuración para hibernate es

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

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">
org.apache.derby.jdbc.ClientDriver
</property>
<property name="connection.url">
jdbc:derby://localhost:1531/dracof
</property>
<property name="connection.username">dracof</property>
<property name="connection.password">dracof</property>

<property name="current_session_context_class">
thread
</property>
<property name="dialect">
org.hibernate.dialect.DerbyDialect
</property>
<property name="show_sql">true</property>

<mapping resource="org/dracof/hibernate/Persona.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Con ayuda de Spring se inyecta el sessionFactory

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="sessionFactory" factory-method="getSessionFactory"
class="org.dracof.hibernate.util.HibernateUtil"/>

<bean id="personaDAO"
class="org.dracof.hibernate.dao.impl.PersonaDAOImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>

Podemos usar el factory-method para obtener el sessionFactory desde HibernateUtil, por ultimo se crea una clase para probar lo programado

package org.dracof.test;

import org.dracof.hibernate.Persona;
import org.dracof.hibernate.dao.PersonaDAO;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.
ClassPathXmlApplicationContext;

public class Test {

public static void main(String[] args) {
String appxml = "applicationContext.xml";
ApplicationContext context =
new ClassPathXmlApplicationContext( appxml );

PersonaDAO personaDAO =
(PersonaDAO)context.getBean("personaDAO");

//Creacion de Persona
Persona persona = new Persona();
persona.setNombre("Juan");
persona.setApellidoP("Perez");
persona.setEdad(50);
personaDAO.creaPersona( persona );

//Obtencion de Persona
persona = null;
persona = personaDAO.obtienePersona("Juan");
System.out.println( "Apellido de Juan: " +
persona.getApellidoP() );

Borrado de Persona
personaDAO.eliminaPersona( "Juan" );
}
}

Si ejecutamos el Test la salida es la siguiente

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into PERSONA (APELLIDOP, EDAD, NOMBRE) values (?, ?, ?)
Hibernate: select persona0_.NOMBRE as NOMBRE0_0_, persona0_.APELLIDOP as APELLIDOP0_0_, persona0_.EDAD as EDAD0_0_ from PERSONA persona0_ where persona0_.NOMBRE=?
Apellido de Juan: Perez
Hibernate: select persona_.NOMBRE, persona_.APELLIDOP as APELLIDOP0_, persona_.EDAD as EDAD0_ from PERSONA persona_ where persona_.NOMBRE=?
Hibernate: delete from PERSONA where NOMBRE=?

Con este ejercicio tambien se puede omitir la construccion de la clase HibernateUtil modificando el applicationContext.xml inyectandole a la propiedad configLocation de
LocalSessionFactoryBean el valor classpath:hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="sessionFactory"
class="org.springframework.orm.
hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml"/>
</bean>

<bean id="personaDAO"
class="org.dracof.hibernate.dao.impl.PersonaDAOImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>

Para esta configuracion conservamos completamente el archivo hibernate.cfg.xml, en otros casos solo lo podemos usar para el mapeo de recursos y en otros casos se puede hasta eliminar este archivo y escribir la configuración en el applicationContext.xml.


Codigo Java
Script SQL

Suerte.

martes, 11 de agosto de 2009

dependency-check en Spring

Uso de dependency-check en Spring

A continuacion se muestra el uso del atributo dependency-check con varios ejemplos

Librearias

commons-logging.jar
spring.jar

Listado de Interfaces

Interface Trabajo

package org.dracof.spring.depcheck;

public interface Trabajo {
}

Interface Domicilio

package org.dracof.spring.depcheck;

public interface Domicilio {
}

Interface Persona

package org.dracof.spring.depcheck;

import java.util.List;

public interface Persona {
public void setNombre(String nombre);

public void setApellido(String apellido);

public void setEdad(int edad);

public void setEstatura(float estatura);

public void setDomicilio(Domicilio domcilio);

public void setTrabajosList(List<Trabajo> trabajos);

public void setNombreAmigos (String[] amigos);
}

Implementaciones

Clase TrabajoImpl implementacion de Trabajo

package org.dracof.spring.depcheck.impl;

import org.dracof.spring.depcheck.Trabajo;

public class TrabajoImpl implements Trabajo {
//metodos e implementacion de trabajo
}

Clase DomicilioImpl implementacion de Domicilio

package org.dracof.spring.depcheck.impl;

import org.dracof.spring.depcheck.Domicilio;

public class DomicilioImpl implements Domicilio{
//metodos e implementacion de Domicilio
}

Clase PersonaImpl implementacion Persona

package org.dracof.spring.depcheck.impl;

import java.util.List;

import org.dracof.spring.depcheck.Domicilio;
import org.dracof.spring.depcheck.Persona;
import org.dracof.spring.depcheck.Trabajo;

public class PersonaImpl implements Persona {

private String nombre;
private String apellido;
private int edad;
private float estatura;
private Domicilio domicilio;
private List<Trabajo> trabajos;
private String[] amigos;

public void setApellido(String apellido) {
this.apellido = apellido;
}

public void setEdad(int edad) {
this.edad = edad;
}

public void setEstatura(float estatura) {
this.estatura = estatura;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public void setDomicilio(Domicilio domcilio) {
this.domicilio = domcilio;
}

public void setTrabajosList(List<Trabajo> trabajos) {
this.trabajos = trabajos;
}

public void setNombreAmigos(String[] amigos) {
this.amigos = amigos;
}

public String toString() {
StringBuilder s = new StringBuilder();
s.append("Nombre: " + nombre);
s.append("; Apellido: "+ apellido);
s.append("; Edad: " + edad);
s.append("; Estatura: " + estatura);
s.append("; Amigos: ");
for(String amigo:amigos) {
s.append(amigo+",");
}
return s.toString();
}
}

Application Context (applicationContext.xml)

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

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
<bean id="persona1" class="org.dracof.spring.depcheck.impl.PersonaImpl" dependency-check="none"/>

<bean id="persona3" class="org.dracof.spring.depcheck.impl.PersonaImpl" dependency-check="simple">
<property name="nombre" value="Dracof"/>
<property name="apellido" value="ApellidoDracof"/>
<property name="edad" value="28"/>
<property name="estatura" value="1.70"/>
<property name="nombreAmigos" value="Juanito, Pepito, Dracofito"/>
</bean>

<bean id="persona4" class="org.dracof.spring.depcheck.impl.PersonaImpl" dependency-check="objects">
<property name="domicilio">
<bean class="org.dracof.spring.depcheck.impl.DomicilioImpl"/>
</property>
<property name="trabajosList">
<list>
<bean class="org.dracof.spring.depcheck.impl.TrabajoImpl"/>
<bean class="org.dracof.spring.depcheck.impl.TrabajoImpl"/>
</list>
</property>
</bean>

<bean id="persona5" class="org.dracof.spring.depcheck.impl.PersonaImpl" dependency-check="all">
<property name="nombre" value="Dracof"/>
<property name="apellido" value="ApellidoDracof"/>
<property name="edad" value="28"/>
<property name="estatura" value="1.70"/>
<property name="domicilio">
<bean class="org.dracof.spring.depcheck.impl.DomicilioImpl"/>
</property>
<property name="trabajosList">
<list>
<bean class="org.dracof.spring.depcheck.impl.TrabajoImpl"/>
<bean class="org.dracof.spring.depcheck.impl.TrabajoImpl"/>
</list>
</property>
<property name="nombreAmigos" value="Juanito, Pepito, Dracofito"/>
</bean>

</beans>

Como se muestra el atributo dependency-check acepta none, simple, objects y all, siendo por default none.

Por ejemplo si se borra el setter nombreAmigos de persona5 que tiene dependency-check="all", Spring lanza

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'persona5' defined in class path resource [applicationContext.xml]:
Unsatisfied dependency expressed through bean property 'nombreAmigos': Set this property value or disable dependency checking for this bean.

Referencia:
Checking for dependencies

Descargar Proyectito
DependencyCheck.zip

Suerte.

jueves, 6 de agosto de 2009

Uso de inyeccion por constructor y setters en Spring

Muestra el uso basico de inyeccion por constructor y por setter con Spring.

commons-logging.jar
spring.jar

Definicio de la interface DatosPersonales

package org.dracof.spring.inyeccion;

public interface DatosPersonales {

public void setNombre(String nombre);

public void setEdad(int edad);

public void setRfc(String rfc);
}

Implementacion de la interface DatosPersonales

package org.dracof.spring.inyeccion.impl;

import org.dracof.spring.inyeccion.DatosPersonales;

public class DatosPersonalesImpl implements DatosPersonales {

private String nombre;
private int edad;
private String rfc;

public DatosPersonalesImpl(){
}

public DatosPersonalesImpl(String nombre, int edad, String rfc){
this.nombre = nombre;
this.edad = edad;
this.rfc = rfc;
}

public void setEdad(int edad) {
this.edad = edad;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public void setRfc(String rfc) {
this.rfc = rfc;
}

public String toString() {
StringBuilder cadena = new StringBuilder();
cadena.append("Nombre:").append( this.nombre );
cadena.append("; Edad: ").append( this.edad );
cadena.append("; RFC: ").append( this.rfc );
return cadena.toString();
}
}

Application Context

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

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
<!-- Inyeccion por setters -->
<bean id="datosPersonalesJuanito" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<property name="nombre" value="Juanito"/>
<property name="edad" value="33"/>
<property name="rfc" value="JAN32323212"/>
</bean>

<!-- Inyeccion por setters usando <value>-->
<bean id="datosPersonalesPepito" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<property name="nombre">
<value>Pepito</value>
</property>
<property name="edad">
<value>54</value>
</property>
<property name="rfc">
<value>PEP2145322</value>
</property>
</bean>

<!-- Inyeccion por constructor respetando orden de parametros -->
<bean id="datosPersonalesDracofito" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<constructor-arg value="Drascofito"/>
<constructor-arg value="28"/>
<constructor-arg value="DRA231234"/>
</bean>

<!-- Inyeccion por constructor indicando el orden de parametros con index -->
<bean id="datosPersonalesDracofito2" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<constructor-arg value="Drascofito" index="0"/>
<constructor-arg value="DRA231234" index="2"/>
<constructor-arg value="28" index="1"/>
</bean>

<!-- Inyeccion por constructor usando <value> -->
<bean id="datosPersonalesGordita" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<constructor-arg>
<value>Gordita</value>
</constructor-arg>
<constructor-arg>
<value>15</value>
</constructor-arg>
<constructor-arg>
<value>GOR544321</value>
</constructor-arg>
</bean>

<!-- Definicion de string para usarlo despues como ref -->
<bean id="nombreX" class="java.lang.String">
<constructor-arg value="Nombre Desconocido"/>
</bean>

<!-- Definicion de Integer para usarlo despues como ref -->
<bean id="edadX" class="java.lang.Integer">
<constructor-arg value="0"/>
</bean>

<!-- Definicion de string para usarlo despues como ref -->
<bean id="rfcX" class="java.lang.String">
<constructor-arg value="RFC Desconocido"/>
</bean>

<!-- Inyeccion por constructor usando referencias a otros beans definidos-->
<bean id="datosPersonalesDesconocido" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<constructor-arg ref="nombreX"/>
<constructor-arg ref="edadX"/>
<constructor-arg ref="rfcX"/>
</bean>
</beans>

Clase de pruebas

package org.dracof.spring.test;

import org.dracof.spring.inyeccion.DatosPersonales;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DatosPersonalesPrueba {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

DatosPersonales datosJuanito = (DatosPersonales) context.getBean("datosPersonalesJuanito");
System.out.println( datosJuanito.toString() );

DatosPersonales datosPepito = (DatosPersonales) context.getBean("datosPersonalesPepito");
System.out.println( datosPepito.toString() );

DatosPersonales datosDracofito = (DatosPersonales) context.getBean("datosPersonalesDracofito");
System.out.println( datosDracofito.toString() );

DatosPersonales datosDracofito2 = (DatosPersonales) context.getBean("datosPersonalesDracofito2");
System.out.println( datosDracofito2.toString() );

DatosPersonales datosGordita = (DatosPersonales) context.getBean("datosPersonalesGordita");
System.out.println( datosGordita.toString() );

DatosPersonales datosDesconocido = (DatosPersonales) context.getBean("datosPersonalesDesconocido");
System.out.println( datosDesconocido.toString() );

}
}

Salida:

Nombre:Juanito; Edad: 33; RFC: JAN32323212
Nombre:Pepito; Edad: 54; RFC: PEP2145322
Nombre:Drascofito; Edad: 28; RFC: DRA231234
Nombre:Drascofito; Edad: 28; RFC: DRA231234
Nombre:Gordita; Edad: 15; RFC: GOR544321
Nombre:Nombre Desconocido; Edad: 0; RFC: RFC Desconocido

Descargar Proyectito
InyeccionSpring.zip

Suerte.

Uso de Scope Basico en Spring

Muestra el uso del scope singleton y prototype en spring

Librerias

spring.jar
commons-logging.jar


Interface IPrototype

package org.dracof.spring.scope;

public interface IPrototype {}

Interface ISingleton

package org.dracof.spring.scope;

public interface ISingleton {}

Implementacion de IPrototype

package org.dracof.spring.scope.impl;

import org.dracof.spring.scope.IPrototype;

public class ClasePrototypeImpl implements IPrototype{
public ClasePrototypeImpl() {
System.out.println("Creando nueva instancia de ClasePrototypeImpl!");
}
}

Implementacion de ISingleton

package org.dracof.spring.scope.impl;

import org.dracof.spring.scope.ISingleton;

public class ClaseSingletonImpl implements ISingleton {
public ClaseSingletonImpl() {
System.out.println("Creando nueva instancia de ClaseSingletonImpl!");
}
}

applicationContext.xml

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

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>

<!-- Por default es singleton -->
<bean id="claseSingleton"
class="org.dracof.spring.scope.impl.ClaseSingletonImpl"
scope="singleton"/>

<bean id="clasePrototype"
class="org.dracof.spring.scope.impl.ClasePrototypeImpl"
scope="prototype"/>

</beans>

Clase de prueba

package org.dracof.spring.test;

import org.dracof.spring.scope.IPrototype;
import org.dracof.spring.scope.ISingleton;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class PruebaScope {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

ISingleton claseSingleton1 = (ISingleton)context.getBean("claseSingleton");
ISingleton claseSingleton2 = (ISingleton)context.getBean("claseSingleton");
ISingleton claseSingleton3 = (ISingleton)context.getBean("claseSingleton");

IPrototype clasePrototype1 = (IPrototype)context.getBean("clasePrototype");
IPrototype clasePrototype2 = (IPrototype)context.getBean("clasePrototype");
IPrototype clasePrototype3 = (IPrototype)context.getBean("clasePrototype");
}
}

Salida

Creando nueva instancia de ClaseSingletonImpl!
Creando nueva instancia de ClasePrototypeImpl!
Creando nueva instancia de ClasePrototypeImpl!
Creando nueva instancia de ClasePrototypeImpl!

Descargar proyectito
ScopeSpring.zip

Suerte.