Mucha gente, después de leer mis artículos sobre la creación de una plantilla para un proyecto web y sobre la creación de un servicio web simple usando servlets , se preguntaron cuándo escribiría sobre Spring. No quería, sugerí leer un libro (y sigo diciendo que un libro es mejor que 10, o incluso 100 artículos en Internet). Pero ahora he decidido que dedico más tiempo a explicar lo mismo a diferentes personas que si me sentara una vez y escribiera un artículo y luego publicara un enlace. Así que escribo por el enlace)). En este artículo no escribiré cómo hacer un proyecto funcional en Spring en 5 minutos siguiendo mi ejemplo. Escribiré solo sobre cosas básicas, sin saberlas, ciertamente es posible iniciar un proyecto, pero no quedará claro qué está sucediendo allí y, lo que es más importante, por qué.
Como puedes ver, el resorte tiene una estructura modular. Esto nos permite conectar sólo aquellos módulos que necesitamos para nuestra aplicación y no conectar aquellos que obviamente no usaremos. Hasta donde yo sé, fue este enfoque el que ayudó a Spring a superar a su competidor en ese momento (EJB) y tomar la delantera. Porque las aplicaciones que utilizan EJB arrastran consigo muchas dependencias y, en general, resultan lentas y torpes. La imagen muestra que la estructura de resortes consta de varios módulos:
¿Qué es el marco de primavera?
Spring Framework , o simplemente Spring , es uno de los frameworks más populares para crear aplicaciones web en Java. Un marco es algo similar a una biblioteca (quizás este término le resulte más familiar), pero hay un punto. En términos generales, al usar una biblioteca, simplemente crea objetos de las clases que se encuentran en ella, llama a los métodos que necesita y así obtiene el resultado que necesita. Es decir, hay un enfoque más imperativo: indicas claramente en tu programa en qué momento específico necesitas crear qué objeto, en qué momento necesitas llamar a un método específico, etc. Con los marcos, las cosas son ligeramente diferentes. Simplemente escribe algunas de sus propias clases, escribe alguna parte de la lógica allí y el marco mismo crea objetos de sus clases y llama a métodos por usted. La mayoría de las veces, sus clases implementan algunas interfaces del marco o heredan algunas clases de él, recibiendo así parte de la funcionalidad ya escrita para usted. Pero no tiene por qué ser así. En Spring, por ejemplo, intentan alejarse lo más posible de un acoplamiento tan estricto (cuando sus clases dependen directamente de algunas clases/interfaces de este marco) y usan anotaciones para este propósito. Volveremos sobre este punto más adelante. Pero es importante comprender que Spring es solo un conjunto de algunas clases e interfaces que ya se han escrito para usted :) También quiero señalar de inmediato que Spring se puede usar no solo para aplicaciones web, sino también para la consola más común. aplicaciones que son tan familiares para todos nosotros programas Y hoy incluso escribiremos algo así.Estructura
Pero Spring no es un marco específico. Este es más bien un nombre general para una serie de marcos pequeños, cada uno de los cuales realiza algún tipo de trabajo diferente.- acceso a los datos;
- web;
- centro;
- y otros.
¿Por qué Spring en Java?
Bueno, además del hecho de que está de moda, es elegante y juvenil, puedo decir de inmediato que tan pronto como lo domines aunque sea un poco, comprenderás cuánto trabajo diferente no tienes que hacer ahora y cuánto primavera. asume. Puede escribir un par de docenas de líneas de configuraciones, escribir un par de clases y obtendrá un proyecto funcional. Pero tan pronto como empiezas a pensar en cuánto hay "bajo el capó", cuánto trabajo se está haciendo y cuánto código tendría que escribirse si hicieras el mismo proyecto en servlets simples o en sockets y Java puro. - se te ponen los pelos de punta :) Incluso existe una expresión como la "magia" de la primavera. Aquí es cuando ves que todo está funcionando, pero estimas aproximadamente cuánto debe suceder allí para que todo funcione y cómo funciona allí; entonces parece que todo esto sucede gracias a algún tipo de magia)) Es más fácil Llámalo todo mágico en lugar de tratar de explicar cómo está todo interconectado allí. sonríedata
_ web-mvc
_ security
_ solo lo básico.
DI/COI
Si intentaste leer algo en Spring, lo primero que encontrarás probablemente fueron estas letras: DI/IoC . ¡Ahora te recomiendo encarecidamente que te tomes un descanso de este artículo y leas este artículo sobre Habré ! IoC (Inversión de control) : inversión de control. Ya mencioné esto de pasada cuando escribí que cuando usas una biblioteca, tú mismo escribes en tu código qué método de qué objeto llamar y, en el caso de los marcos, la mayoría de las veces el marco llamará al código que escribiste a la derecha. momento. Es decir, aquí ya no controlas el proceso de ejecución del código/programa, sino que el framework lo hace por ti. Le transfiriste el control (inversión de control). DI se entiende como Inversión de dependencia (inversión de dependencia, es decir, intentos de no establecer conexiones duras entre sus módulos/clases, donde una clase está directamente vinculada a otra), o Inyección de dependencia (inyección de dependencia, esto es cuando los objetos cat no están creado por ti en el archivo principal y luego los pasas a tus métodos, y Spring los crea para ti, y simplemente le dices algo como "Quiero tener un gato aquí" y él te lo pasa en tu método). Nos encontraremos más a menudo con el segundo en futuros artículos.Frijoles y contexto
Uno de los conceptos clave en primavera es la frijol . En esencia, es sólo un objeto de alguna clase. Digamos que para nuestro programa necesitamos usar 3 objetos: un gato, un perro y un loro. Y tenemos un montón de clases con un montón de métodos, donde a veces necesitamos un gato para un método y un perro para otro método, y a veces tendremos métodos en los que necesitamos un gato y un loro (por ejemplo, un método para alimentar a un gato, jeje), y en algunos métodos, se necesitarán los tres objetos. Sí, primero podemos crear estos tres objetos en el archivo principal, y luego pasarlos a nuestras clases, y desde dentro de las clases a los métodos que necesitemos... Y así sucesivamente a lo largo del programa. Y si también imaginamos que periódicamente queremos cambiar la lista de parámetros aceptados para nuestros métodos (bueno, decidimos reescribir algo o agregar funcionalidad), entonces tendremos que editar bastante el código si es necesario. cambia algo. Ahora bien, ¿qué pasa si imaginamos que no tenemos 3, sino 300 objetos de este tipo? Una alternativa es reunir todos nuestros objetos en una lista común de objetos ( List<Object> ) y pasarla a todos los métodos, y desde dentro de los métodos obtener este o aquel objeto que necesitamos. Pero, ¿y si imaginamos que a medida que avanza el programa, algún objeto puede ser agregado a esta lista o (lo que es peor) eliminado? Luego, en todos los métodos en los que recuperamos objetos de la lista por su índice, todo puede fallar. Luego decidimos almacenar no una lista, sino un mapa, donde la clave será el nombre del objeto que necesitamos y el valor será el objeto en sí, y luego podremos obtener los objetos que necesitamos simplemente por su nombre. : get("parrot") y en respuesta recibimos un objeto loro O, por ejemplo, la clave es la clase del objeto y el valor es el objeto en sí, entonces ya no podemos indicar el nombre del objeto, sino simplemente la clase del objeto que necesitamos, lo cual también es conveniente. O incluso escribir algún tipo de contenedor sobre el mapa, donde pueda crear métodos para que en algunos casos pueda recuperar objetos por su nombre y en otros casos por clase. Esto es lo que obtenemos del contexto de la aplicación de primavera . Un contexto es un conjunto de beans (objetos). Pasando al contexto, podemos obtener el bean (objeto) que necesitamos por su nombre, por ejemplo, o por su tipo, o por cualquier otra cosa. Además, podemos pedirle a Spring que busque el bean que necesitamos en su contexto y lo pase a nuestro método. Por ejemplo, si tuviéramos un método como este:public void doSomething(Cat cat) {
...
}
Cuando Spring llamó a este método por nosotros, le pasó el objeto de nuestro gato desde su contexto. Ahora decidimos que nuestro método, además de un gato, también necesita un loro. Usando la primavera, ¡nada es más fácil para nosotros! Simplemente escribimos:
public void doSomething(Cat cat, Parrot parrot) {
...
}
y Spring, cuando llame a este método nuestro, entenderá que necesitamos pasar un gato y un loro aquí, ir a su contexto, obtener estos dos objetos y pasarlos a nuestro método. Al entregarle las riendas de nuestro programa a Spring, también le transferimos la responsabilidad de crear objetos y pasarlos a nuestros métodos, que él llamará. Surge la pregunta: ¿cómo sabrá Spring qué objetos (contenedores) crear?
Métodos de configuración de aplicaciones
Hay tres formas principales de configurar una aplicación (es decir, decirle a Spring qué objetos necesitamos para trabajar):- usando archivos/configuraciones xml;
- usando configuraciones de Java;
- configuración automática.
- el método más prioritario al que se debe dar preferencia es la configuración automática;
- si usando la configuración automática no es posible configurar correctamente todos los beans posibles, use la configuración Java (creando objetos usando código Java);
- Bueno, la forma de menor prioridad es la antigua, usando configuraciones xml.
GO TO FULL VERSION