unidades:08_spring:02_spring
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=" | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||