M4-UF1 FRAMEWORK SPRING
UNIDAD 4: El framework Spring
eugeniaperez.es
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Entorno de desarrollo
- Utilizaremos como IDE: Eclipse J2EE Luna
- Para creación de proyectos Spring: instalar plugin STS
- Crearemos los proyectos Spring con estructura Maven:
- File -> New Spring Project -> Simple Spring Maven
Estamos creando un proyecto ordinario en Spring con la estructura de Maven. Incluirá el pom con sus dependencias
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Entorno de desarrollo
- Los proyectos Spring se marcarán con un S (a diferencia de los Maven, con la M)
-
Para la configuración de Spring: beans.xml que se almacena en src/main/resources. Para generarlo:
-
New > Other > Spring > Spring Bean Configuration File
-
Debemos especificar los espacios de nombres XSD
Y ya está listo para introducir beans!
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID)
- Permite instanciar objetos sin tener que hacer uso del new ¡¡Desacoplamiento!!
- Esto facilita en gran medida reducir el acoplamiento entre clases, haciendo que éstas sean más sencillas (POJOs)
- También facilita las pruebas unitarias: cuando testeamos el software necesitamos probar a fondo los objetos...
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring (ID)
Inyección de dependencias (ID)
- El mensajero necesita un vehículo que limitamos a una furgoneta y no podrá usar ningún otro vehículo.
- Tampoco podremos testear que realmente se llama al método moverse() (void)
public class Mensajero {
private Furgoneta vehiculo = new Furgoneta();
public Mensajero () {
}
public void desplazarse () {
vehiculo.moverse();
}
}
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring (ID)
Inyección de dependencias (ID)
-
Usando ID esas dependencias se asignarán desde fuera.
Hay dos formas básicas de hacerlo: constructor o set.
-
Además usando una interfaz se facilitan:
-
poder meter distintos tipos de vehículo (que deben implementar ese interfaz)
-
simplificar el testeo del método desplazarse.
-
eugeniaperez.es
UNIDAD 4: framework SPRING
4.2 Características de Spring (ID)
Inyección de dependencias (ID)
eugeniaperez.es
public interface Vehiculo {
public void moverse();
}
public class Furgoneta implements Vehiculo {
private int deposito;
public void moverse() {
if (deposito > 0)
deposito--;
}
}
Programando por contratos...
UNIDAD 4: framework SPRING
4.2 Características de Spring (ID)
Inyección de dependencias (ID)
eugeniaperez.es
public class Mensajero {
private Vehiculo vehiculo;
public Mensajero (Vehiculo vehiculo) {
this.vehiculo = vehiculo;
}
public void desplazarse () {
vehiculo.moverse();
}
}
El vehículo, de cualquier tipo que implemente esa interfaz, se asignará desde fuera, en el XML de Spring.
Testear el método desplazarse fácilmente
UNIDAD 4: framework SPRING
4.2 Características de Spring (ID)
Inyección de dependencias (ID)
Comprobando que realmente se llama al método moverse():
import static org.mockito.Mockito.*;
import org.junit.Test;
public class MensajeroTest {
@Test
public void desplazarseLlamaAMoverse () {
// Creamos el mock para las pruebas
Vehiculo vehiculoFalso = mock(Vehiculo.class);
// Inyectamos esa instancia para la prueba
Mensajero mensajero = new Mensajero(vehiculoFalso);
mensajero.desplazarse();
// AHORA SÍ, podemos verificar si se llama a moverse una vez (junit)
verify(vehiculoFalso, times(1)).moverse();
}
}
Lo ideal es probar lo que sale fuera: los métodos públicos: La interfaz!!
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID)
- Permite instanciar objetos sin tener que hacer uso del new ¡¡Desacoplamiento!!
- La creación de instancias se delega en el fichero de contexto de Spring: beans.xml
- Aplicado a un ejemplo sencillo de relación 1:1 unidireccional entre Persona y Dirección.
- Una Persona posee una Dirección...
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID)
public class Person {
private long id;
private String name;
private Address address;
//Getters, setters & toString()
}
public class Address {
private long id;
private String street;
private String postCode;
//Getters, setters & toString()
}
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID) - Mediante set
<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 ">
<bean id="address" class="org.sistema.spring.dependencyInjection.models.Address">
<property name="id" value="1" />
<property name="street" value="Avenida Barañáin" />
<property name="postCode" value="31000" />
</bean>
<bean id="person" class="org.sistema.spring.dependencyInjection.models.Person">
<property name="id" value="1" />
<property name="name" value="Eugenia" />
<property name="address" ref="address" />
</bean>
</beans>
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID) - Mediante set
- Lo anterior es el equivalente a lo que ya conocemos:
Address address = new Address();
address.setId(1);
address.setStreet("Avenida Barañáin");
address.setPostCode("31000");
Person person = new Person();
person.setId(1);
person.setName("Eugenia");
person.setAddress(address);
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID) - Mediante set
- Otra manera: utilizando properties de manera abreviada: 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-beans-3.0.xsd ">
<bean id="address" class="org.sistema.spring.dependencyInjection.models.Address"
p:id="1" p:street="Avenida Barañáin" p:postCode="31000" />
<bean id="person" class="org.sistema.spring.dependencyInjection.models.Person"
p:id="1" p:name="Eugenia" p:address-ref="address" />
</beans>
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID) - Mediante constructor
<?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.2.xsd">
<bean id="address" class="com.sistema.spring.Address">
<constructor-arg name="id" value="1" />
<constructor-arg name="street" value="Avenida Barañáin" />
<constructor-arg name="postCode" value="31000" />
</bean>
<bean id="person" class="com.sistema.spring.Person">
<constructor-arg name="id" value="1" />
<constructor-arg name="name" value="Eugenia" />
<constructor-arg name="address" ref="address" />
</bean>
</beans>
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID) - Mediante constructor
- Lo anterior es el equivalente a lo que ya conocemos:
Address address = new Address(1, "Avenida Barañáin", "31000");
Person person = new Person(1, "Eugenia", address);
Necesitarás un constructor en cada clase que reciba todos esos parámetros y, adicionalmente, su constructor por defecto.
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID)
- En la clase Main se carga el contexto de Spring a partir del beans.xml y a obtener el bean person (address se inicializará en cadena).
- Es decir, se encargará de instanciar la Person y de inyectar e instanciar el resto. Por último la imprime.
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Inyección de dependencias (ID)
public class Main {
private static ApplicationContext context;
public static void main(String[] args) {
context = new ClassPathXmlApplicationContext("beans.xml");
Person person = (Person) context.getBean("person");
System.out.print(person);
}
}
Person [id=1, name=Eugenia, address=Address [id=1, street=Avenida Barañáin, postCode=31000]]
unidad 5: FRAMEWORK sPRING
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto spring.dependencyinjection del repositorio de Bitbucket:
Usuario:
Psswd:
https://eugenia_perez@bitbucket.org/eugenia_perez/spring.dependencyinjection.git
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Autowiring
- Permite crear instancias de clases desde el fichero XML de configuración (crear objetos)
- Las instancias se asignan solas de forma automática
- Se realiza mediante el elemento bean en el fichero XML
- No es necesario indicar los atributos de objetos compuestos de los que consta cada clase
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
SIN autowiring
<bean id="customer" class="com.sistema.common.Customer">
<property name="person" ref="person" />
</bean>
<bean id="person" class="com.sistema.common.Person" />
<bean id="customer" class="com.sistema.common.Customer" autowire="byName" />
<bean id="person" class="com.sistema.common.Person" />
CON autowiring
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
El proyecto javamon consiste en una clase combate que carga dos instancias de la clase Javamon (por autowiring) y las hace pelear. Todo ello se maneja desde una clase principal.
unidad 4: FRAMEWORK SPRING
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto spring.autowiring del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.autowiring.git
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
El método Main:
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"beans.xml");
Combat combat = (Combat) context.getBean("combat");
combat.combat();
System.out.println("And the winner is: " + combat.outcome().getName());
System.out.println("Thanks for playing javamon");
}
}
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Creamos dos beans llamados estratégicamente javamon1 y javamon2 que DEBEN COINCIDIR con los nombres de los atributos de la clase Combat. En la instancia de combat debemos decir que hacemos autowiring, y spring hilará el resto
<bean id="javamon1" class="org.sistema.spring.autowiring.models.Javamon">
<constructor-arg value="Pikachu" />
</bean>
<bean id="javamon2" class="org.sistema.spring.autowiring.models.Javamon">
<constructor-arg value="Bulbasur" />
</bean>
<bean id="combat" class="org.sistema.spring.autowiring.models.Combat"
autowire="byName">
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Autowiring con anotaciones
También es posible la DI mediante anotaciones en las propias clases (@Autowired).
Y añadiendo en el beans.xml el espacio de nombres de context y la etiqueta: <context:annotation-config/>
UNIDAD 4: framework SPRING
eugeniaperez.es
4.2 Características de Spring
Autowiring con anotaciones
El proyecto consiste una serie de clases que representan las clases de un partido de fútbol.
unidad 4: FRAMEWORK SPRING
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto spring.autowiringannotations del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.autowiringannotations.git
UNIDAD 4: framework SPRING
eugeniaperez.es
4.3 Spel
- SpEL o Spring Expression Language es un lenguaje introducido desde la versión 3 de Spring
- Permite asignar valores complejos calculados en tiempo de ejecución
- SpEL nos permite hacer operaciones aritméticas, condicionales y hacer referencia a valores de otros beans existentes.
UNIDAD 4: framework SPRING
eugeniaperez.es
4.3 Spel
La expresión más simple de SpEL es un valor dentro de #{}:
También podríamos mostrar una propiedad de un bean:
<property name=”speed” value=”#{140}” />
<property name=”description” value=”Your age is #{84}” />
<property name=”street2” value=”#{'address.street'}” />
<property name=”streets” value=”#{'streets[2]'}” />
O una colección...
UNIDAD 4: framework SPRING
eugeniaperez.es
4.3 Spel
Mediante el operador T() tenemos acceso a atributos y métodos estáticos de las clases:
También se puede hacer de esta otra forma usando pseudojava y operaciones aritméticas como se ve en el ejemplo anterior:
<property name=”strength” value=”#{T(java.lang.Math).PI}” />
<property name=”strength” value=”#{T(java.lang.Math).random()}” />
#{new java.util.Random().nextInt(6) + 1}
UNIDAD 4: framework SPRING
eugeniaperez.es
4.3 Spel
Operaciones aritméticas (+, -, * , /, %, ^):
Operaciones de comparación (<,>,==,<=, >=, lt, gt, eq, le, ge):
Operaciones lógicas (and, or, not, !):
Operaciones condicionales y ternaria (?):
<property name=”area” value=”#{T(java.lang.Math).PI * 40 ^2}” />
<property name=”isAllowed” value=”#{customer1.age > 17}” />
<property name=”isHero” value=”#{player1.speed > 100 and player1.level >19}” />
<property name=”weapon” value=”#{player1.fight()?axe:sword}” />
UNIDAD 4: framework SPRING
eugeniaperez.es
4.4 Spring JDBC
- Crearemos un proyecto que realice operaciones CRUD sobre un estudiante mediante JDBC (forma "tradicional" sin ORM)
- Habrá que crear la tabla en MySQL que represente al estudiante
- Configurar los parámetros de conexión a base de datos en el bean.xml
unidad 4: mapeo de clases persistentes
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto spring.jdbc del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.jdbc.git
Unidad 4
By eugenia_perez
Unidad 4
- 1,207