JavaRush /Blog Java /Random-ES /La primavera es para los perezosos. Fundamentos, concepto...
Стас Пасинков
Nivel 26
Киев

La primavera es para los perezosos. Fundamentos, conceptos básicos y ejemplos con código. Parte 1

Publicado en el grupo Random-ES
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)). La primavera es para los perezosos.  Fundamentos, conceptos básicos y ejemplos con código.  Parte 1 - 1En 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é.

¿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.
La primavera es para los perezosos.  Fundamentos, conceptos básicos y ejemplos con código.  Parte 1 - 2
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:
  • acceso a los datos;
  • web;
  • centro;
  • y otros.
Hoy nos familiarizaremos con algunos conceptos del módulo principal, como: beans, contexto y otros. Como puede imaginar, el módulo de acceso a datos contiene herramientas para trabajar con datos (principalmente bases de datos), web , para trabajar en la red (incluida la creación de aplicaciones web, que se discutirán más adelante). Además, también existe la llamada infraestructura Spring completa: muchos otros proyectos que no están incluidos oficialmente en el marco en sí, pero que se integran perfectamente en su proyecto Spring (por ejemplo, la misma seguridad Spring para trabajar con autorización del usuario en el sitio, que, espero, también sentiremos algún día).

¿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íe data_ 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):
  1. usando archivos/configuraciones xml;
  2. usando configuraciones de Java;
  3. configuración automática.
Los desarrolladores de Spring los organizan en este orden de prioridad:
  • 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.
Además, Spring te permite combinar estos métodos. Por ejemplo, deje que Spring haga todo lo que se puede configurar automáticamente; cuando necesite especificar algunos parámetros especiales, hágalo usando configuraciones de Java y, además, puede conectar algunas configuraciones heredadas en formato xml. En general, todo esto se puede hacer de forma bastante flexible. Pero aún así, si todo se puede hacer usando la configuración automática, úsala. Sólo consideraré la configuración automática y las configuraciones de Java; Las configuraciones xml ya se utilizan en casi todos los ejemplos de Spring en Internet, y una vez que comprenda cómo funciona la configuración de Java, no debería haber problemas para "leer" un archivo xml que haga lo mismo. La configuración automática se utiliza cuando los objetos que necesitamos para trabajar son objetos de clases que hemos escrito . Si se necesita alguna lógica muy específica para crear un objeto de nuestra clase, o si no tenemos la oportunidad de marcar una clase con la anotación que necesitamos, que sería recogida por la configuración automática, esto se puede hacer en las configuraciones de Java. . En la siguiente parte crearemos un proyecto maven, le conectaremos un par de módulos de resorte centrales y crearemos nuestros primeros beans.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION