Publicado el 22 de Enero del 2019
374 visualizaciones desde el 22 de Enero del 2019
855,8 KB
30 paginas
Experto Universitario Java
Enterprise
Spring
Sesión 1: Spring core
Experto Universitario Java Enterprise
Puntos a tratar
Introducción. Spring vs. JavaEE estándar
•
• El contenedor de beans (Spring core)
•
Trabajo con beans
• Definir beans
•
• Ámbitos
Instanciar beans
• Acceder a recursos externos con beans
• Definir beans en XML y Java
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
2
Experto Universitario Java Enterprise
¿Qué es Spring?
•
Inicialmente, un ejemplo hecho para el libro
“J2EE design and development” de Rod
Johnson, que defendía alternativas a la
“visión oficial” de aplicación JavaEE
basada en EJBs
• Actualmente es un framework completo
que cubre todas las capas de la aplicación,
con decenas de desarrolladores y miles de
descargas al día
• MVC
• Negocio (donde empezó originalmente)
• Acceso a datos
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring Core 3
Spring core
3
Experto Universitario Java Enterprise
Generaciones de EJBs
• La generación 2.X de EJB era demasiado pesada para las máquinas
de la época y además compleja y difícil de usar
• En esta época fue cuando surgió Spring
• La generación actual de EJBs (3.X) es mucho más sencilla de usar
•
•
Inspirada en la forma de trabajar de Spring y otros frameworks
Irónicamente, el principal problema de Spring pueden ser sus buenas
ideas
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
4
Experto Universitario Java Enterprise
La filosofía de Spring
• Los objetos de negocio deberían ser POJOs
•
• Se pueden conseguir servicios equivalentes a los que nos dan los
Inyección como medio de resolver dependencias
EJB usando AOP de manera casi transparente al programador
• El contenedor debe poder ser un servidor web convencional (ej.
• Cuando ya hay algo que funciona, incorpóralo a tu solución, no
Tomcat)
JPA , Hibernate para persistencia de datos
“reinventes la rueda”
•
• AspectJ para AOP
• Hessian para acceso remoto
•
...
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
5
Experto Universitario Java Enterprise
Qué nos aporta Spring
+
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
6
POJOServicios EnterpriseInyección de dependenciasEstereotipos configurablesBlueprints
Experto Universitario Java Enterprise
El “ecosistema” de Spring
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
7
Experto Universitario Java Enterprise
Versiones de Spring
• La generación actual es la 3
• En la 2.X, se potenció bastante el framework y se simplificó mucho su
configuración
• Cada vez más énfasis en el uso de anotaciones
• Las novedades de la versión 3 están sobre todo en la capa web
(validación, REST)
• Spring tiene una excelente documentación
– Hay mucha bibliografía adicional disponible y también una amplia
comunidad de desarrollo
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
8
Experto Universitario Java Enterprise
Spring vs. JavaEE estándar
• Hace unos años Spring tenía una
ventaja tecnológica muy
considerable
• Actualmente los dos
“contendientes” son muy similares
• Ventajas de Spring:
• Despliegue en servidores
convencionales (Tomcat)
“Portabilidad”
•
• Ventajas del estándar
• Es estándar ;-)
JavaOne 2011: Migrating Spring Applications
to Java EE 6
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
9
Spring migration analyzer (JavaEE -> Spring)
Experto Universitario Java Enterprise
Spring Core
• Es un contenedor que gestiona el ciclo de vida de los objetos de
nuestra aplicación
• En realidad no es más que un conjunto de librerías que se puede
ejecutar en cualquier servidor web java
• Ofrece servicios a nuestros objetos, como inyección de
dependencias
• Juntándolo con otros módulos, más servicios
•
•
•
(+ AOP): Transaccionalidad declarativa
(+ Spring Remoting): Acceso remoto
( + Spring Security): Seguridad declarativa
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
10
Experto Universitario Java Enterprise
Spring vs. factorías
• Normalmente un objeto de negocio necesita la colaboración de
otros objetos de negocio, DAOs, etc.
• En código java “puro” la forma estándar de instanciar un objeto
es la factoría (para independizarnos de la implementación)
public class JPATest {
private EntityManagerFactory emf;
public void test1() {
emf = Persistence.createEntityManagerFactory("simplejpa");
EntityManager em = emf.createEntityManager();
…
}
}
• Spring core es una alternativa a las factorías basada en la
inyección de dependencias
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
11
Experto Universitario Java Enterprise
Inyección de dependencias
•
“Confiamos” en que “alguien” instancie y nos pase el objeto
que necesitamos para trabajar
– En nuestro caso ese “alguien” es Spring Core
public class JPATest {
private EntityManagerFactory emf;
public void test1() {
emf = Persistence.createEntityManagerFactory("simplejpa");
EntityManager em = emf.createEntityManager();
}
public void setEmf(EntityManagerFactory emf) {
}
}
this.emf = emf;
• Si se configura adecuadamente, Spring nos asegura que el
setter se llamará justo después de crear el JPATest
– Pero para eso el JPATest también lo tiene que crear Spring
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
12
Experto Universitario Java Enterprise
Definir los beans
• Un bean en Spring es un componente cuyo ciclo de vida está
“gestionado” por Spring
• No se crea con new, sino que lo crea Spring Core y lo obtenemos
con inyección de dependencias
• Normalmente relacionado con otros componentes (dependencias)
• Hay tres opciones para la configuración
• XML: la clásica. Tediosa, pero al ser independiente del código
fuente nos da más flexibilidad y elimina la recompilación
• Anotaciones: mucho más cool y más sencilla de usar
• Java: podemos usar el chequeo de código de nuestro IDE para
validar la configuración
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
13
Experto Universitario Java Enterprise
Ficheros de definición de beans
• La manera “clásica” de definir beans es con XML
<?xml version="1.0"?>
<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.xsd">
class="es.ua.jtech.spring.negocio.GestorUsuarios">
<bean id="miGestor"
</bean
</beans>
• Aunque no la usemos, siempre tiene que haber al menos un
fichero XML
• Ciertas cosas hay que hacerlas en XML
• O al menos, con XML decirle a Spring que usaremos anotaciones para hacer
cierta tarea
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
14
Experto Universitario Java Enterprise
Definir un bean con anotaciones
• Spring ofrece varios estereotipos:
• O la estándar de JSR330: @Named
• @Service: componente de negocio
• @Repository: DAO
• @Component
package es.ua.jtech.spring.negocio;
@Service(“miGestor”)
public class GestorUsuarios {
public UsuarioTO login(String login, String password) {
...
}
}
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
15
Experto Universitario Java Enterprise
¿Y en el fichero XML...?
•
Le “decimos” a Spring que examine automáticamente todos los subpaquetes de
algún paquete en busca de beans
xmlns:context="http://www.springframework.org/schema/context"
<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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package=”es.ua.jtech.spring”/>
</beans>
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
16
Experto Universitario Java Enterprise
¿Y para acceder al bean desde mi código?
• Caso 1: Desde otro bean (otro objeto gestionado):
inyección de dependencias. También podríamos usar el
@Inject/@Named estándar
package es.ua.jtech.spring.negocio;
“Programar contra interfaces, no
implementaciones”
@Service
public class UsuariosBO implements IUsuariosBO{
@Autowired
private IUsuariosDAO iudao;
package es.ua.jtech.spring.datos;
...
}
@Repository
public class UsuariosDAO implements IUsuariosDAO{
public Usuario getUsuario(String id) {
...
}
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
17
Experto Universitario Java Enterprise
Spring soporta las anotaciones JSR330
• Preferible si queremos mayor portabilidad
• Pero no soporta las del estándar CDI completo, JSR299
package es.ua.jtech.spring.negocio;
@Named
public class UsuariosBO implements IUsuariosBO{
@Inject
private IUsuariosDAO iudao;
package es.ua.jtech.spring.datos;
...
}
@Named
public class UsuariosDAO implements IUsuariosDAO{
public Usuario getUsuario(String id) {
...
}
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring core
18
Experto Universitario Java Enterprise
¿Y para acceder al bean desde mi código? (II)
• Caso 2: desde un objeto no gestionado: escribir código
que busque el objeto
• El API cambia si es una aplicación web o de escritorio
• Cuidado: servlets y JSP no son gestionados por Spring.
Pero si usamos el módulo MVC, tenemos Controllers, que sí
lo son
//En un servlet o JSP, sin Spring MVC
ServletContext sc = getServletContext();
WebApplicationContext wac =
IUsuariosBO ubo = wac.getBean(
Comentarios de: Sesión 1: Spring core (0)
No hay comentarios