unidades:08_spring:02_spring
no way to compare when less than two revisions
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:08_spring:02_spring [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Spring ====== | ||
+ | [[http:// | ||
+ | |||
+ | Spring contiene gran cantidad de funcionalidad pero nosotros únicamente vamos a usar su capacidad de realizar [[patrones: | ||
+ | |||
+ | ¿Pero realmente para qué queremos usar Spring? | ||
+ | |||
+ | En el ejemplo anterior vimos cómo el código de las clases DAO quedaba acoplado a la clase '' | ||
+ | <code java> | ||
+ | SessionFactory sessionFactory=HibernateUtil.getSessionFactory(); | ||
+ | </ | ||
+ | Ésto no es nada conveniente ya que en un futuro podríamos querar cambiar nuestra clase '' | ||
+ | |||
+ | También veíamos cómo al crear un objeto DAO en el código se quedaba programada la implementación que íbamos a usar ya que se ejecutaba el siguiente código: | ||
+ | <code java> | ||
+ | ProfesorDAO profesorDAO=new ProfesorDAOImplHibernate(); | ||
+ | </ | ||
+ | Ésto no permite que se pueda cambiar fácilmente de una implementación a otra. Gracias a Spring podremos configurar muy fácilmente qué implementación usar sin modificar el código. | ||
+ | |||
+ | <note important> | ||
+ | La [[patrones: | ||
+ | </ | ||
+ | |||
+ | Para poder trabajar con el contenedor de [[patrones: | ||
+ | * [[# | ||
+ | * [[#Asignado Beans]]: Cómo indicarle a Spring que queremos que inyecte otro objeto en alguna propiedad de nuestro objeto . | ||
+ | * [[# | ||
+ | |||
+ | <note tip>En la nomenclatura de Spring a los objetos se le llaman Beans</ | ||
+ | ===== Preparando Spring | ||
+ | Spring necesita dos pasos para poder ser usado: | ||
+ | * [[#Crear un fichero de configuración]] | ||
+ | * [[#Crear un objeto con el contexto de Spring desde Java]] | ||
+ | |||
+ | ==== Crear un fichero de configuración ==== | ||
+ | Spring necesita de un fichero xml donde configurar el framework. Dicho fichero suele llamarse '' | ||
+ | |||
+ | El siguiente fichero '' | ||
+ | <code xml 1 | applicationContext.xml> | ||
+ | <?xml version=" | ||
+ | <beans xmlns=" | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | "> | ||
+ | |||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Como se puede ver sólo hemos definido un tag raiz llamado ''< | ||
+ | |||
+ | <note tip> | ||
+ | Spring posee muchísimas opciones de configuración en el fichero '' | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Se puede encontrar más información sobre los namespaces de XML en [[wpes> | ||
+ | </ | ||
+ | |||
+ | ==== Crear un objeto con el contexto de Spring desde Java ==== | ||
+ | Junto con el fichero '' | ||
+ | <code java> | ||
+ | ApplicationContext context =new ClassPathXmlApplicationContext(" | ||
+ | </ | ||
+ | |||
+ | Deberemos crear una nueva instancia de <javadoc s31> | ||
+ | |||
+ | Al constructor la estamos pasando el nombre del fichero de configuración de Spring pero delante le añadimos el texto '' | ||
+ | ===== Asignado Beans ===== | ||
+ | Hay tres formas de asignar un Bean a una propiedad/ | ||
+ | * Mediante el fichero de configuración '' | ||
+ | * [[#Mediante las anotaciones]] | ||
+ | * [[#Mediante código]] | ||
+ | |||
+ | En este tutorial únicamente vamos a explicar las dos últimas. | ||
+ | |||
+ | ==== Mediante las anotaciones ==== | ||
+ | La anotación '' | ||
+ | <code java> | ||
+ | @Autowired | ||
+ | ProfesorDAO profesorDAO; | ||
+ | </ | ||
+ | Con este código Spring buscará un Bean que implemente el interfaz '' | ||
+ | |||
+ | <note tip> | ||
+ | En caso de que Spring no encuentre ningún Bean que se pueda asignar a la propiedad se producirá la excepción: | ||
+ | org.springframework.beans.factory.NoSuchBeanDefinitionException: | ||
+ | </ | ||
+ | |||
+ | Desgraciadamente, | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | ==== Mediante código ==== | ||
+ | Ya hemos visto en el apartado anterior cómo en el método '' | ||
+ | |||
+ | Si queremos asignar un bean a una variable o propiedad debemos llamar al método <javadoc s31> | ||
+ | |||
+ | <code java> | ||
+ | ProfesorController profesorController=context.getBean(ProfesorController.class); | ||
+ | </ | ||
+ | Con esta línea Spring buscará un Bean que sea compatible con la clase '' | ||
+ | |||
+ | <note tip> | ||
+ | ¿No es un poco estúpida la línea anterior? No sería mucho mas fácil crear directamente el objeto con un '' | ||
+ | <code java> | ||
+ | ProfesorController profesorController=new ProfesorController(); | ||
+ | </ | ||
+ | |||
+ | Desgracidamente Spring no hace magia (( Realmente sí que la puede hacer usando AOP, pero es complejo de configurar )) y necesitamos que Spring cree los objetos para que luego le podamos inyectar las dependencias. Si él no los crea no sabrá nada de ellos y no hará nada sobre ellos. | ||
+ | |||
+ | Así que como mínimo deberemos llamar una vez a <javadoc s31> | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Definiendo Beans ===== | ||
+ | Spring permite dos formas de definir los beans | ||
+ | * [[#En el fichero applicationContext.xml]] | ||
+ | * [[#Mediante anotaciones]] | ||
+ | |||
+ | |||
+ | ==== En el fichero applicationContext.xml ==== | ||
+ | El tag ''< | ||
+ | |||
+ | <code xml> | ||
+ | <bean class=" | ||
+ | <bean class=" | ||
+ | </ | ||
+ | En nuestro caso se han definido 2 beans correspondientes a las 2 clases '' | ||
+ | |||
+ | ¿Qué significa realmente ésto? | ||
+ | Que ahora mediante la anotación '' | ||
+ | <code java> | ||
+ | @Autowired | ||
+ | ProfesorDAO profesorDAO; | ||
+ | </ | ||
+ | Cuando Spring vea que la propiedad '' | ||
+ | |||
+ | Lo mismo pasará con '' | ||
+ | <code java> | ||
+ | @Autowired | ||
+ | UsuarioDAO usuarioDAO; | ||
+ | </ | ||
+ | A la propiedad '' | ||
+ | |||
+ | <note important> | ||
+ | Si hubiera más de un bean definido que se puede asignar a una misma propiedad se producirá una excepción. | ||
+ | |||
+ | Por ejemplo, si definimos dos beans que implementan el mismo interfaz: | ||
+ | <code xml> | ||
+ | <bean class=" | ||
+ | <bean class=" | ||
+ | </ | ||
+ | |||
+ | Al ejecutar el código Spring produciría la siguiente excepción: | ||
+ | org.springframework.beans.factory.NoSuchBeanDefinitionException: | ||
+ | |||
+ | ya que no sabría si usar la implementación de Hibernate o de JDBC. | ||
+ | |||
+ | </ | ||
+ | |||
+ | === Métodos Factory | ||
+ | En muchos ocasiones nos encontraremos que, para crear el Bean Spring no debe crear la clase directamente sino llamar a algún método de otra clase para que cree dicho bean. Para ello Spring dispone del atributo '' | ||
+ | |||
+ | <code xml> | ||
+ | <bean class=" | ||
+ | </ | ||
+ | |||
+ | En este caso le estamos indicando a Spring que llamando al método '' | ||
+ | |||
+ | Ahora en la clase '' | ||
+ | <code java | GenericDAOImplHibernate> | ||
+ | @Autowired | ||
+ | SessionFactory sessionFactory; | ||
+ | </ | ||
+ | Y deberemos eliminar la línea en la que llamábamos a '' | ||
+ | |||
+ | <note tip> | ||
+ | Recuerda que al poner el nombre del método en el atributo '' | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | También quiero recalcar que al usar el atributo '' | ||
+ | </ | ||
+ | ==== Mediante anotaciones ==== | ||
+ | Cualquier clase de Java la podemos anotar con la anotación '' | ||
+ | |||
+ | En nuestro ejemplo, los controladores se han anotado con dicha propiedad | ||
+ | <code java 1> | ||
+ | @Component | ||
+ | public class ProfesorController { | ||
+ | |||
+ | @Autowired | ||
+ | ProfesorDAO profesorDAO; | ||
+ | | ||
+ | public void guardar(Profesor profesor) throws BussinessException { | ||
+ | |||
+ | profesorDAO.saveOrUpdate(profesor); | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Vemos en la línea 1 la anotación '' | ||
+ | |||
+ | Desgraciadamente con sólo poner esa anotación no es suficiente para que Spring encuentre el Bean. Necesitamos decirle el paquete | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | El atributo '' | ||
+ | |||
+ | ===== applicationContext.xml ===== | ||
+ | En este último apartado mostraremos el fichero '' | ||
+ | |||
+ | <code xml> | ||
+ | <?xml version=" | ||
+ | <beans xmlns=" | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | "> | ||
+ | |||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | |||
+ | |||
+ | <bean class=" | ||
+ | <bean class=" | ||
+ | <bean class=" | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
unidades/08_spring/02_spring.txt · Última modificación: 2023/04/07 21:26 por 127.0.0.1