JPA, Hibernate y Spring Rodolfo Campos http://www.smartcamp.es/~camposer/indra/hibernate-spring/ Madrid, Septiembre de 2012 JPA, Hibernate y Spring Fundamentos de Spring Spring Spring es un marco de trabajo (framework) Java que provee una infraestructura liviana y robusta para soportar aplicaciones Java. ●Spring maneja los detalles de infraestructura, para que los desarrolladores puedan centrarse en el desarrollo per se. Para lograr esto se apoya en técnicas ampliamente difundidas y aceptadas, algunas de ellas: Inyección de Dependencias (DI) y Programación Orientada a Aspectos (AOP) ● Módulos Inyección de Dependencias (DI) Inyección de Dependencias (DI) o Inversión de Control (IoC) es un proceso donde los objetos (beans) definen sus dependencias, es decir, los objetos con los que trabajan, a través de: ●Argumentos de constructores ●Argumentos de un método factoría ●Propiedades del objeto una vez creado. Configuración Existen 3 formas de configurar beans de Spring ●XML ●Anotaciones. ●Java MetaData. El método más difundido es el de configuración a través de XML Configuración XML (ejemplo) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <import resource="services.xml"/> <import resource="resources/messageSource.xml"/> <import resource="/resources/themeSource.xml"/> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl"> <property name="accountDao" ref="accountDao"/> <property name="itemDao" ref="itemDao"/> </bean> </beans> Instanciación <!-- Constructor --> <bean id="bar" class="x.y.Bar"/> <bean id="foo" class="x.y.Foo"> <constructor-arg ref="bar"/> <constructor-arg ref="baz"/> <constructor-arg type="int" value="7500000"/> </bean> <!-- Factory Method --> <bean id="exampleBean" class="examples.ExampleBean2" factory-method="createInstance"/> <!-- Factory Object --> <bean id="exampleBean" factory-bean="serviceLocator" factory-method="createInstance"/> Espacio de nombres “p” <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans3.0.xsd"> <bean name="classic" class="com.example.ExampleBean"> <property name="email" value="foo@bar.com"/> </bean> <bean name="p-namespace" class="com.example.ExampleBean" p:email="foo@bar.com"/> </beans> Depends-on y Inicialización “lazy” Depends-on: ● <bean id="beanOne" class="ExampleBean" depends-on="manager"/> Inicialización “lazy” ● <bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazyinit="true"/> <beans default-lazy-init="true"> <!-- no beans will be pre-instantiated... --> </beans> Ámbitos de los beans Singleton (por defecto) ●Prototype ●Request (HTTP Request) ●Session (HTTP Session) ●Global Session (típico de Aplicaciones Portlet) ● Singleton Prototype Utilizando el contenedor // create and configure beans ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"}); // retrieve configured instance PetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class); // use configured instance List userList service.getUsernameList(); Utilizando el contenedor ... <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/services.xml</paramvalue> </context-param> <listener> <listenerclass>org.springframework.web.context.ContextLoaderL istener</listener-class> </listener> ... JPA, Hibernate y Spring JPA + Spring Spring, JPA y DAO Persistence.xml JpaTemplate Persistence EntityManager Factory EntityManagerFactoryBean Query EntityManager Transaction persist() find() merge() delete() Config – applicationContext.xml (#1) Inject into entityManagerFacto r transactionManager Config – applicationContext.xml (#2) Inject into entityManagerFacto r DepartmentDAO Inject into JPAServiceBean DAO - save DAO - delete DAO - update DAO - findById ServiceBean (#1) ServiceBean (#2) Recursos Spring Documentation. Core Technologies: The IoC container. Extraído el 16 de Septiembre de: http://static.springsource.org/spring/docs/3.0.x/spring-frameworkreference/html/beans.html ●Guo, A. Spring + JPA + DAO. Step by Step. Extraído el 17 de Septiembre de: http://www.slideshare.net/junyuo/spring-jpa-daostep-by-step-presentation ●Faria, A. Spring 3. Extraído el 17 de Septiembre de: http://www.slideshare.net/andrefaria/spring-3 ●