Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Introducción a
Edwin Maraví
emaravi@cjavaperu.com
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
¿Qué es Spring?
• Spring es un Framework no-intrusivo creado por Rod Johnson y descrito en su libro
Expert One-on-One J2EE Design and Development
• Basado en el principio de Inversión de Control (IoC).
• Desarrollo a través de Beans y POJOs.
• Integración con otros framework como Struts, Ibatis, Hibernate, Junit, Trapestry,
FreeMarker, etc.
• Abstracción para el manejo de Transacciones.
• Soporte para Aspectos (AOP).
• Sigue el paradigma de Convención sobre Configuración (CoC).
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
¿Por qué Spring?
• Promueve el desacoplamiento de las capas y la independencia de las mismas.
• Desarrollo orientado a interfaces.
• TDD los POJOs y demás elementos del modelo pueden ser testeadas sin haber definido un framework.
• Promueve el uso de buenas prácticas.
• Se integra con otras tecnologías.
• Es no-intrusivo.
• Posee una arquitectura sólida y extremadamente modular.
• Trae muchas reutilizables y sencillas de heredar.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Spring surgió en 2003 como respuesta a la complejidad de las
primeras especificaciones J2EE . Mientras que algunos consideran que Java EE y Spring compiten,
Spring es, de hecho, complementario a Java EE. El modelo de programación de Spring no incluye la
especificación de la plataforma Java EE; más bien, se integra con especificaciones individuales
cuidadosamente seleccionadas del paraguas EE:
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Inyection of Control IoC
“No nos llames, nosotros te
llamaremos” Principio de
Hollywood.
• Utiliza la técnica de Inyección de Dependencias
o DI, en la cual el contenedor automáticamente
asigna (inyecta) implementaciones de objetos
cuando y donde se le solicite.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Temas
• Como una aplicación tan simple puede ganar agilidad y testeabilidad aplicando
conceptos de desacoplamiento con interfaces e Inversión de Control.
• Problemas a solucionar:
– ¿Como puedo cambiar cierta parte de mi aplicación sin afectar el resto del
código?
– ¿Puedo relacionar diferentes partes de mi aplicación sin tener que escribir
mucho código?
– ¿Cómo puedo probar la lógica de negocio de forma rápida y sencilla sin
atarme a un framework en particular?
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Historial de modificaciones
• HolaMundo.
• HolaMundo con argumentos por línea de comandos.
• HolaMundo desacoplado sin interfaces.
• HolaMundo desacoplado usando interfaces.
• HolaMundo desacoplado usando Factorías.
• HolaMundo con usando SpringFramework
BeanFactory sin DI.
• HolaMundo con usando SpringFramework con DI.
• HolaMundo con usando SpringFramework con DI y
archivos de configuración XML.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
1. HolaMundo
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo: Identificando Problemas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo: Áreas para refactoring
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
2. HolaMundo con argumentos por línea de
comandos
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo con argumentos por línea de
comandos
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo con argumentos por línea de comandos:
Áreas modificadas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo con argumentos por línea de comandos:
Identificando Problemas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo con argumentos por línea de comandos:
Áreas para refactoring
La lógica para mostrar el mensaje debería ser independiente del resto del código.
La lógica para obtener el mensaje debería ser independiente del resto del código,
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
3. HolaMundo desacoplado sin interfaces
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado sin interfaces
Desacoplar la lógica de la implementación del Proveedor de Mensajes, creando una clase independiente.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado sin interfaces
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado sin interfaces
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado sin interfaces
//Clase principal
public class HolaMundoDesacoplado{
rem.setProveedorDeMensajes(pm);
rem.mostrar();
}
}
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado sin interfaces: Áreas
modificadas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado sin interfaces: Identificando
Problemas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado sin interfaces: Áreas para
refactoring
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
4. HolaMundo desacoplado con interfaces
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado con interfaces
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado con interfaces
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado con interfaces
public class RenderizadorEstandarDeMensajes implements RenderizadorDeMensajes{
//continua
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado con interfaces
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado con interfaces
//Clase principal
public class HolaMundoDesacoplado{
rm.setProveedorDeMensajes(pm);
rm.mostrar();
}
}
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado con interfaces: Áreas
modificadas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado con interfaces: Identificando
Problemas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado con interfaces: Áreas para
refactoring
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
5. HolaMundo desacoplado usando Factorias
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado usando Factorias
public class FabricaDeSoporteDeMensajes {
private static FabricaDeSoporteDeMensajes instancia = null;
private Properties props = null;
private RenderizadorDeMensajes renderer = null;
private ProveedorDeMensajes proveedor = null;
private FabricaDeSoporteDeMensajes(){
props = new Properties();
try{
props.load(new FileInputStream(“msf.properties”));
//Obtener el nombre de las Implementaciones
String clsRender = props.getProperty(“renderer.class”);
String clsProveedor = props.getProperty(“proveedor.class”);
renderer = (RenderizadorDeMensajes)Class.forName(clsRender).newInstance();
proveedor = (ProveedorDeMensajes)Class.forName(clsProveedor).newInstance();
}catch(Exception ex){ ex.printStackTrace();}
}
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado usando Factorias
static {
instancia = new FabricaDeSoporteDeMensajes();
}
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado usando Factorias
ProveedorDeMensajes pm = FabricaDeSoporteDeMensajes.getInstancia().
getProveedorDeMensajes();
rm.setProveedorDeMensajes(pm);
rm.mostrar();
}
}
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado usando Factorias
Archivo Properties
#msf.properties
renderer.class = RenderizadorEstandarDeMensajes
proveedor.class = HolaMundoProveedorDeMensajes
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado usando Factorias: Áreas
modificadas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado usando Factorias:
Identificando Problemas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo desacoplado usando Factorias: Áreas
para refactoring
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
6. HolaMundo usando Spring Framework
BeanFactory sin DI
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework
BeanFactory sin DI
public class HolaMundoSpring {
public static void main(String[] args) throws Exception{
//BeanFactory es una clase de Spring
BeanFactory fabrica = getBeanFactory();
RenderizadorDeMensajes rm =
(RenderizadorDeMensajes)fabrica.getBean(“renderer”);
ProveedorDeMensajes pm =
(ProveedorDeMensajes)fabrica.getBean(“proveedor”);
rm.setProveedorDeMensajes(pm);
rm.mostrar();
}
//continua...
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework
BeanFactory sin DI
//no hay necesidad de entender este codigo
private static BeanFactory getBeanFactory() throws Exception{
//obtener la fabrica de Beans
DefaultListableBeanFactory fabrica = new
DefaultListableBeanFactory();
PropertiesBeanDefinitionReader rdr = new
PropertiesBeanDefinitionReader();
rdr.registerBeanDefinitions(props);
return fabrica;
}
}
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework BeanFactory sin
DI : Áreas modificadas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework BeanFactory sin
DI : Identificando Problemas
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
7. HolaMundo usando Spring Framework con DI
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework con DI
Archivo Properties
#Renderizador de Mensajes
renderer.class = RenderizadorEstandarDeMensajes
proveedor.class = HolaMundoProveedorDeMensajes
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework con DI
RenderizadorDeMensajes rm =
(RenderizadorDeMensajes)fabrica.getBean(“renderer”);
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework con DI
private static BeanFactory getBeanFactory() throws Exception{
//obtener la fabrica de Beans
DefaultListableBeanFactory fabrica = new
DefaultListableBeanFactory();
PropertiesBeanDefinitionReader rdr = new
PropertiesBeanDefinitionReader();
rdr.registerBeanDefinitions(props);
return fabrica;
}
}
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework con DI
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework con DI:
Observaciones
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
8. HolaMundo usando Spring Framework con DI
y archivos de configuración XML
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework con DI y archivos
de configuración XML
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework con DI y
archivos de configuración XML
<beans>
<bean id=“renderer” class=“RenderizadorEstandarDeMensajes”>
<property name=“proveedorDeMensajes”>
<ref local=“proveedor”>
</property>
</bean>
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
HolaMundo usando Spring Framework con DI y
archivos de configuración XML
public class HolaMundoSpringConDIXML {
public static void main(String[] args) throws Exception{
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
IoC: Bean Factory
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
IoC: Dependency Injection
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Links de Referencia
Web Spring
- http://spring.io
Spring Framework
- http://projects.spring.io/spring-framework
Documentación de Referencia
- http://docs.spring.io/spring/docs/4.0.5.RELEASE/spring-framework-
reference/htmlsingle
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Spring Boot
Edwin Maravi
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Objetivos
Después de completar esta lección, tu deberías ser
capaz de:
– Construir aplicaciones con Spring Boot
– Enumerar las principales características de Spring Boot
– Conocer las herramientas utilizadas en la actualidad para
programación
– Realizar la primera aplicación con Spring Boot
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Componentes Spring Cloud
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Donde esta Spring Boot
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Que es
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
¿Qué es Spring Boot?
Al construir aplicaciones con Spring Framework se necesita
realizar tres pasos fundamentales.
1 Seleccionar jars con maven
2 Crear la aplicación
3 Desplegar en servidor
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Principales características
• Crea aplicaciones Spring standalone.
• Tomcat, Jetty o Undertow embebido directamente (no se necesita deplegar WAR)
• Provee starter POMs para simplificar la configuración Maven
• Configura Spring donde sea posible.
• Provee funciones listas para producción como métricas, health checks y
configuración externalizada.
• Sin generación de código y ningún requerimiento de configuración XML.
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas para empezar un proyecto
• Cualquier motor de base de datos relacional como MySQL, MariaDB, Postgres, SQL
• Maven o gradle
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Estructura de un archivo POM
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Package as an executable jar/war -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Clase inicial
@SpringBootApplication
public class SpringBootFirstApplication {
}
}
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Mi primera aplicación
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Quiz
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Quiz
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Principales anotaciones
• @SpringBootApplication
• @ComponentScan
• @EntityScan
• @JpaRepositories
• @EnableAutoConfiguration
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.
Gracias
Av. Arenales 395 Oficina 405 / 43376948 / info@cjavaperu.com CJava, siempre para apoyarte.