Marco de primavera

Marco de aplicación para la plataforma Java
Marco de primavera
Desarrollador(es)VMware
Lanzamiento inicial1 de octubre de 2002 ; hace 22 años ( 01-10-2002 )
Versión estable
6.1.4 [1]  / 15 de febrero de 2024 ; hace 9 meses ( 15 de febrero de 2024 )
Repositorio
  • github.com/spring-projects/spring-framework
Escrito enJava
PlataformaJava EE
TipoMarco de aplicación
LicenciaLicencia Apache 2.0
Sitio webspring.io/projects/spring-framework 

Spring Framework es un marco de aplicación y un contenedor de inversión de control para la plataforma Java . [2] Las características principales del marco pueden ser utilizadas por cualquier aplicación Java, pero existen extensiones para crear aplicaciones web sobre la plataforma Java EE (Enterprise Edition). El marco no impone ningún modelo de programación específico . [ cita requerida ] El marco se ha vuelto popular en la comunidad Java como una adición al modelo Enterprise JavaBeans (EJB). [3] Spring Framework es un software libre y de código abierto . [4] : 121–122  [5]

Historial de versiones

VersiónFechaNotas
0.92003
1.024 de marzo de 2004Primer lanzamiento de producción.
2.02006
3.02009
4.02013
5.02017
6.022 de noviembre de 2022
6.116 de noviembre de 2023
6.2Su estreno está previsto para noviembre de 2024

La primera versión fue escrita por Rod Johnson , quien lanzó el marco con la publicación de su libro Expert One-on-One J2EE Design and Development en octubre de 2002. El marco se lanzó por primera vez bajo la licencia Apache 2.0 en junio de 2003. La primera versión de producción, 1.0, se lanzó en marzo de 2004. [6] El marco Spring 1.2.6 ganó un premio de productividad Jolt y un premio de innovación JAX en 2006. [7] [8] Spring 2.0 se lanzó en octubre de 2006, Spring 2.5 en noviembre de 2007, Spring 3.0 en diciembre de 2009, Spring 3.1 en diciembre de 2011 y Spring 3.2.5 en noviembre de 2013. [9] Spring Framework 4.0 se lanzó en diciembre de 2013. [10] Las mejoras notables en Spring 4.0 incluyeron soporte para Java SE (Standard Edition) 8, Groovy 2, [11] [12] algunos aspectos de Java EE 7 y WebSocket . [13]

Spring Framework 4.2.0 se lanzó el 31 de julio de 2015 y se actualizó inmediatamente a la versión 4.2.1, que se lanzó el 1 de septiembre de 2015. [14] Es "compatible con Java 6, 7 y 8, con un enfoque en mejoras centrales y capacidades web modernas" . [15]

Spring Framework 4.3 se lanzó el 10 de junio de 2016 y recibió soporte hasta 2020. [16] Se anunció que "sería la última generación dentro de los requisitos generales del sistema Spring 4 (Java 6+, Servlet 2.5+), [...]" . [15]

Se anuncia que Spring 5 se basará en Reactor Core compatible con Reactive Streams . [17] [ fuente obsoleta ]

Spring Framework 6.0 se lanzó el 16 de noviembre de 2022 y viene con una línea base de Java 17+ y una transición a Jakarta EE 9+ (en el jakartaespacio de nombres), con un enfoque en las API de Jakarta EE 10 lanzadas recientemente , como Servlet 6.0 y JPA 3.1. [18]

Módulos

Spring Framework incluye varios módulos que brindan una variedad de servicios:

Los módulos Spring se empaquetan como archivos JAR. [46] Se puede acceder a estos artefactos a través del Repositorio central de Maven usando Maven [47] o Gradle . [48]

Contenedor de inversión de control

El contenedor de inversión de control (IoC) es el contenedor principal en Spring Framework. [2] Proporciona un medio consistente para configurar y administrar objetos Java [2] [4] : 127–131  mediante reflexión . [49] El contenedor es responsable de administrar los ciclos de vida de objetos específicos: [4] : 128  creando estos objetos, [50] llamando a sus métodos de inicialización , [49] y configurando estos objetos conectándolos entre sí. [51]

En muchos casos, no es necesario utilizar el contenedor cuando se utilizan otras partes de Spring Framework, aunque su uso probablemente hará que una aplicación sea más fácil de configurar y personalizar. El contenedor Spring proporciona un mecanismo consistente para configurar aplicaciones [4] : 122  y se integra con casi todos los entornos Java, desde aplicaciones de pequeña escala hasta aplicaciones empresariales de gran tamaño.

El programador no crea directamente un objeto, sino que describe cómo debe crearse definiéndolo en el archivo de configuración de Spring. De manera similar, los servicios y componentes no se invocan directamente; en su lugar, un archivo de configuración de Spring define qué servicios y componentes deben invocarse. Este IoC tiene como objetivo aumentar la facilidad de mantenimiento y prueba.

Creación y gestión de beans

Los objetos creados por el contenedor se denominan objetos administrados o beans . [52] El contenedor se puede configurar cargando archivos XML (lenguaje de marcado extensible) [50] [4] : 151–152  o detectando anotaciones Java específicas en las clases de configuración. Estas fuentes de datos contienen las definiciones de beans que proporcionan la información necesaria para crear los beans.

La @Configurationes una anotación específica de Spring que marca una clase como la clase de configuración. La clase de configuración proporciona los beans a Spring ApplicationContext. [53] Cada uno de los métodos en la clase de configuración de Spring se configura con la @Beananotación. La ApplicationContextinterfaz devolverá entonces los objetos configurados con la @Beananotación como beans. La ventaja de la configuración basada en Java sobre la configuración basada en XML es una mejor seguridad de tipos y refactorización. [53]

Tipos de inversión de control

Existen varios tipos de Inversión de Control. La inyección de dependencias y la búsqueda de dependencias son ejemplos de Inversión de Control. [54] Los objetos pueden obtenerse mediante la búsqueda de dependencias o la inyección de dependencias. [4] : 127  [55]

Inyección de dependencia

La inyección de dependencia es un patrón en el que el contenedor pasa objetos [4] : 128  por nombre a otros objetos, ya sea a través de constructores , [4] : 128  propiedades o métodos de fábrica . Hay varias formas de implementar la inyección de dependencia: inyección de dependencia basada en constructor, inyección de dependencia basada en setter e inyección de dependencia basada en campo. [56]

Búsqueda de dependencia

La búsqueda de dependencia es un patrón en el que un llamador solicita al objeto contenedor un objeto con un nombre específico o de un tipo específico.

Cableado automático

El marco Spring tiene una característica conocida como autocableado, que utiliza el contenedor Spring para satisfacer automáticamente las dependencias especificadas en las propiedades de JavaBean para objetos del tipo apropiado en la fábrica actual. [57] Esto solo puede ocurrir si hay un solo objeto con el tipo apropiado. [57]

Hay varias anotaciones que se pueden usar para el cableado automático de POJO, incluida la anotación específica de Spring @Autowire(así como varias otras anotaciones específicas de Spring que ayudan a resolver la ambigüedad del cableado automático, como las anotaciones @Qualifiero ), [58] [59] y las anotaciones estándar de Java y . [60]@Primary@Resource@Inject

La @Qualifieranotación se puede utilizar en una clase que define un bean para informar a Spring que priorice la creación del bean al conectarlo automáticamente por nombre. [59]

La @Primaryanotación se puede utilizar en una clase que define un bean para informar a Spring que priorice la creación del bean al conectarlo automáticamente por tipo. [59]

La @Resourceanotación es una anotación que cumple con JSR 250 , o Anotaciones comunes para la plataforma Java. La @Resourceanotación se utiliza para el cableado automático de referencias a POJO por nombre. [60] La @Injectanotación es una anotación que cumple con JSR 300, o Anotaciones estándar para inyección. La @Injectanotación se utiliza para el cableado automático de referencias a POJO por tipo. [60]

Marco de programación orientada a aspectos

Spring Framework tiene su propio marco de programación orientada a aspectos (AOP) que modulariza las preocupaciones transversales en los aspectos . [61] La motivación para crear un marco de AOP independiente es proporcionar características básicas de AOP sin demasiada complejidad en el diseño, la implementación o la configuración. El marco de AOP de Spring aprovecha al máximo el contenedor de Spring.

El marco Spring AOP está basado en patrones proxy . [62] [24] Se configura en tiempo de ejecución . [ cita requerida ] Esto elimina la necesidad de un paso de compilación o de entrelazado en tiempo de carga. [ cita requerida ] Por otro lado, la intercepción solo permite la ejecución de métodos públicos en objetos existentes en un punto de unión . [ cita requerida ]

En comparación con el marco AspectJ , Spring AOP es menos potente, pero también menos complicado. [ cita requerida ] Spring 1.2 incluye soporte para configurar aspectos de AspectJ en el contenedor. Spring 2.0 agregó más integración con AspectJ; por ejemplo, el lenguaje pointcut se reutiliza y se puede mezclar con aspectos basados ​​en Spring AOP. [ cita requerida ] Además, Spring 2.0 agregó una biblioteca Spring Aspects que usa AspectJ para ofrecer características comunes de Spring, como administración de transacciones declarativas [62] e inyección de dependencia a través del tejido de tiempo de compilación o tiempo de carga de AspectJ. [ 63 ] SpringSource usa AspectJ AOP en otros proyectos Spring como Spring Roo y Spring Insight, con Spring Security ofreciendo una biblioteca de aspectos basada en AspectJ. [ cita requerida ]

Spring AOP ha sido diseñado para trabajar con preocupaciones transversales dentro del marco Spring. [4] : 473  Cualquier objeto creado y configurado por el contenedor se puede enriquecer utilizando Spring AOP.

Spring Framework utiliza Spring AOP internamente para la gestión de transacciones, seguridad, acceso remoto y JMX . [ cita requerida ]

Desde la versión 2.0 del framework, Spring ofrece dos enfoques para la configuración de AOP:

<beans xmlns= "http://www.springframework.org/schema/beans" xmlns:mvc= "http://www.springframework.org/schema/mvc" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop= "http://www.springframework.org/schema/aop" xmlns:context= "http://www.springframework.org/schema/context" xsi:schemaLocation= " http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd  http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc.xsd  http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd" >        

El equipo de Spring decidió no introducir nueva terminología relacionada con AOP. Por lo tanto, en la documentación de referencia y la API de Spring, términos como aspect , join point, advice , pointcut, introduction, target object (advised object), AOP proxy y weaving tienen todos los mismos significados [ cita requerida ] que en la mayoría de los demás marcos de AOP (en particular, AspectJ).

Marco de acceso a datos

El marco de acceso a datos de Spring aborda las dificultades comunes que enfrentan los desarrolladores al trabajar con bases de datos en aplicaciones. Se proporciona soporte para todos los marcos de acceso a datos populares en Java: JDBC, iBatis / MyBatis , [32] Hibernate , [32] Java Data Objects (JDO, discontinuado desde 5.x), [32] Jakarta Persistence API (JPA), [32] Oracle TopLink , Apache OJB y Apache Cayenne , entre otros.

Para todos estos marcos compatibles, Spring proporciona estas características

  • Gestión de recursos: adquisición y liberación automática de recursos de bases de datos
  • Manejo de excepciones: traducción de excepciones relacionadas con el acceso a datos a una jerarquía de acceso a datos de Spring [66]
  • Participación en transacciones: participación transparente en transacciones en curso [4] : 290–291 
  • Desenrollado de recursos: recuperación de objetos de base de datos de contenedores de grupos de conexiones
  • Abstracción para el manejo de objetos binarios grandes (BLOB) y objetos de caracteres grandes (CLOB)

Todas estas características se vuelven disponibles al utilizar clases de plantilla proporcionadas por Spring para cada marco compatible. [67] Los críticos han dicho que estas clases de plantilla son intrusivas y no ofrecen ninguna ventaja sobre el uso (por ejemplo) de la API de Hibernate directamente. [68] [ verificación fallida ] En respuesta, los desarrolladores de Spring han hecho posible el uso directo de las API de Hibernate y JPA. Sin embargo, esto requiere una gestión transparente de las transacciones, ya que el código de la aplicación ya no asume la responsabilidad de obtener y cerrar los recursos de la base de datos, [69] y no admite la traducción de excepciones. [70]

Junto con la gestión de transacciones de Spring, su marco de acceso a datos ofrece una abstracción flexible para trabajar con marcos de acceso a datos. El marco Spring no ofrece una API de acceso a datos común; en cambio, se mantiene intacta toda la potencia de las API compatibles. [ cita requerida ] El marco Spring es el único marco disponible en Java que ofrece entornos de acceso a datos administrados fuera de un servidor de aplicaciones o contenedor. [ 71 ] [ se necesita una mejor fuente ]

Al utilizar Spring para la gestión de transacciones con Hibernate, es posible que se deban configurar los siguientes beans:

  • Un Datasourceme gusta com.mchange.v2.c3p0.ComboPooledDataSourceo org.apache.commons.dbcp.BasicDataSource[32]
  • Un SessionFactoryme gusta org.springframework.orm.hibernate3.LocalSessionFactoryBeancon un DataSourceatributo [72] [4] : 173 
  • A HibernateProperties[4] : 173  me gustaorg.springframework.beans.factory.config.PropertiesFactoryBean
  • Un TransactionManagerme gusta org.springframework.orm.hibernate3.HibernateTransactionManagercon un SessionFactoryatributo [72]

Otros puntos de configuración incluyen:

  • Una configuración AOP de puntos de corte.
  • Semántica de transacción del asesoramiento AOP [ aclarar ] .

Gestión de transacciones

El marco de gestión de transacciones de Spring aporta un mecanismo de abstracción a la plataforma Java. [73] Su abstracción es capaz de:

En comparación, Java Transaction API (JTA) solo admite transacciones anidadas y transacciones globales, y requiere un servidor de aplicaciones (y en algunos casos, la implementación de aplicaciones en un servidor de aplicaciones).

Spring Framework incluye PlatformTransactionManager[75] una serie de estrategias de gestión de transacciones:

  • Transacciones gestionadas en una conexión JDBC [73]
  • Transacciones gestionadas en Unidades de trabajo de mapeo relacional de objetos [73]
  • Transacciones gestionadas a través de la JTA [73] JtaTransactionManager[76] [4] : 255–257  y UserTransaction[4] : 234 
  • Transacciones gestionadas en otros recursos, como bases de datos de objetos

Además de este mecanismo de abstracción, el marco proporciona dos formas de agregar gestión de transacciones a las aplicaciones:

  • Procedimentalmente, utilizando Spring TransactionTemplate[77]
  • De manera declarativa, mediante el uso de metadatos como XML o anotaciones Java ( @Transactional, [62] etc.)

Junto con el marco de acceso a datos de Spring, que integra el marco de gestión de transacciones, es posible configurar un sistema transaccional sin tener que depender de JTA o EJB . El marco transaccional también se integra con motores de mensajería [78] y almacenamiento en caché [79] .

Marco modelo-vista-controlador

Presentación Spring MVC/Web Reactive a cargo de Jürgen Höller

Spring Framework cuenta con su propio marco de aplicación web modelo-vista-controlador (MVC) , [35] lo cual no estaba planeado originalmente. Los desarrolladores de Spring decidieron escribir su propio marco web como reacción a lo que percibían como un diseño deficiente del (en ese entonces) popular marco web Jakarta Struts , [80] [ verificación fallida ] así como deficiencias en otros marcos disponibles. En particular, sentían que no había suficiente separación entre las capas de presentación y manejo de solicitudes, y entre la capa de manejo de solicitudes y el modelo. [81]

Al igual que Struts, Spring MVC es un marco basado en solicitudes. [4] : 375  El marco define interfaces de estrategia [4] : 144  para todas las responsabilidades que debe manejar un marco moderno basado en solicitudes. El objetivo de cada interfaz es ser simple y clara para que sea fácil para los usuarios de Spring MVC escribir sus propias implementaciones, si así lo eligen. MVC allana el camino para un código frontend más limpio. Todas las interfaces están estrechamente acopladas a la API de Servlet . Este estrecho acoplamiento a la API de Servlet es visto por algunos como un fracaso por parte de los desarrolladores de Spring para ofrecer un alto nivel de abstracción para aplicaciones basadas en la Web [ cita requerida ] . Sin embargo, este acoplamiento asegura que las características de la API de Servlet permanezcan disponibles para los desarrolladores al mismo tiempo que ofrece un marco de alta abstracción para facilitar el trabajo con él.

La DispatcherServletclase es el controlador frontal [82] del marco y es responsable de delegar el control a las distintas interfaces durante las fases de ejecución de una solicitud HTTP . [83]

Las interfaces más importantes definidas por Spring MVC y sus responsabilidades se enumeran a continuación: [84]

  • Controller: interviene entre Modely Viewpara gestionar las solicitudes entrantes y redirigir a la respuesta adecuada. [85] Controller asignará la solicitud http a los métodos correspondientes. [86] Actúa como una puerta que dirige la información entrante. Cambia entre entrar en Modelo View.
  • HandlerAdapter: responsable de la ejecución de los objetos que manejan las solicitudes entrantes. [87]
  • HandlerInterceptor: responsable de interceptar las solicitudes entrantes. [87] Comparable, pero no igual a los filtros de servlet [4] : 509  (el uso es opcional [4] : 511  y no está controlado por DispatcherServlet).
  • HandlerMapping:responsable de seleccionar objetos que manejan solicitudes entrantes (controladores) en función de cualquier atributo o condición interna o externa a esas solicitudes [83]
  • LocaleResolver:responsable de resolver y opcionalmente guardar la configuración regional de un usuario individual. [88]
  • MultipartResolver:facilita el trabajo con cargas de archivos envolviendo las solicitudes entrantes. [89]
  • View: responsable de devolver una respuesta al cliente. ViewNo debe contener ninguna lógica de negocios y solo debe presentar los datos encapsulados por el Model. [35] Algunas solicitudes pueden ir directamente a Viewsin pasar por la Modelparte ; otras pueden pasar por las tres.
  • ViewResolver: responsable de seleccionar un Viewen base a un nombre lógico para el View[90] [91] (no se requiere estrictamente su uso [4] : 511  ).
  • Model: responsable de encapsular datos comerciales. [90] El controlador lo Modelexpone a la vista. [4] : 374  (su uso no es estrictamente obligatorio).

Cada una de las interfaces de estrategia anteriores tiene una responsabilidad importante en el marco general. Las abstracciones que ofrecen estas interfaces son potentes, por lo que permiten un conjunto de variaciones en sus implementaciones. [4] : 144  Spring MVC se entrega con implementaciones de todas estas interfaces y ofrece un conjunto de características sobre la API de Servlet. Sin embargo, los desarrolladores y proveedores tienen la libertad de escribir otras implementaciones. Spring MVC utiliza la java.util.Mapinterfaz Java como una abstracción orientada a datos para los valores Modelesperados de las claves String. [ cita requerida ]

La facilidad para probar las implementaciones de estas interfaces es una ventaja importante del alto nivel de abstracción que ofrece Spring MVC. [92] [4] : 324  DispatcherServlet está estrechamente acoplado al contenedor de inversión de control de Spring para configurar las capas web de las aplicaciones. Sin embargo, las aplicaciones web pueden usar otras partes de Spring Framework, incluido el contenedor, y elegir no usar Spring MVC.

Un flujo de trabajo de Spring MVC

Cuando un usuario hace clic en un enlace o envía un formulario en su navegador web, la solicitud va a Spring DispatcherServlet. DispatcherServletes un controlador frontal en Spring MVC. [83] [93] El DispatcherServletes altamente personalizable y flexible. [93] Específicamente, es capaz de manejar más tipos de controladores que cualquier implementación de org. springframework.web.servlet.mvc.Controllero org. springframework.stereotype.Controllerclases anotadas. [93] Consulta una o más asignaciones de controladores. [83] DispatcherServlet elige un controlador apropiado y le reenvía la solicitud. El Controllerprocesa la solicitud particular y genera un resultado. Se conoce como Model. Esta información debe formatearse en html o cualquier tecnología de front-end como Jakarta Server Pages (también conocida como JSP) [83] [94] o Thymeleaf . [94] Este es el Viewde una aplicación. [83] Toda la información está en el objeto ModelAnd . Cuando el controlador no está acoplado a una vista particular, encuentra el real (como JSP) con la ayuda de . [83] [4] : 390–391 ViewDispatcherServletViewViewResolver

Configuración de DispatcherServlet

A partir de la versión 3.0 de la Especificación de Servlet, hay algunas formas de configurar DispatcherServlet: [95]

  • Configurándolo web.xmlcomo se muestra a continuación: [95]
<servlet> <nombre-servlet> MyServlet </nombre-servlet> <clase-servlet> org.springframework.web.servlet.DispatcherServlet </clase-servlet> </servlet>  <servlet-mapping> <servlet-name> MyServlet </servlet-name> <url-pattern> / <url-pattern> </servlet-mapping>  
  • Configurándolo en web-fragment.xml[95]
  • Mediante el uso de javax.servlet.ServletContainerInitializer[95]
  • Implementando la org.springframework.web.WebApplicationInitializerinterfaz. [95]
  • Utilizando la configuración automática incorporada para Spring Boot, que utiliza la SpringBootServletInitializerclase .lm [95]

Marco de acceso remoto

El marco de acceso remoto de Spring es una abstracción para trabajar con varias tecnologías basadas en RPC ( llamada a procedimiento remoto ) disponibles en la plataforma Java, tanto para la conectividad del cliente como para la ordenación de objetos en servidores. [96] La característica más importante que ofrece este marco es facilitar la configuración y el uso de estas tecnologías tanto como sea posible combinando la inversión de control y AOP.

El marco proporciona recuperación de fallas (reconexión automática después de una falla de conexión) y algunas optimizaciones para el uso del lado del cliente de beans de sesión sin estado remotos EJB .

Spring proporciona soporte para estos protocolos y productos de manera inmediata

  • Protocolos basados ​​en HTTP
    • Hessian : protocolo de serialización binaria, [97] [4] : 335  de código abierto [4] : 335  y mantenido por protocolos basados ​​en CORBA [ cita requerida ] . Hessian es mantenido por la empresa Caucho . [4] : 335  Hessian es adecuado para necesidades de comunicación remota sin estado, en particular, comunicación Java a Java. [4] : 335–336 
    • Burlap: Un protocolo binario basado en XML que es de código abierto y también mantenido por la empresa Caucho . [97] [4] : 335  La única ventaja de usar Burlap en lugar de Hessian es que es analizable en XML y legible para humanos . [4] : 335  Para la comunicación de Java a Java, se prefiere Hessian ya que es más liviano y eficiente. [4] : 335 
    • RMI (1): invocaciones de métodos que utilizan la infraestructura RMI pero que son específicas de Spring [96]
    • RMI (2): invocaciones de métodos que utilizan interfaces RMI que cumplen con el uso regular de RMI [96]
    • RMI-IIOP ( CORBA ): invocaciones de métodos utilizando RMI-IIOP/CORBA
  • Integración de clientes Enterprise JavaBean [98]
    • Conectividad de beans de sesión sin estado EJB locales: conexión a beans de sesión sin estado locales
    • Conectividad de beans de sesión sin estado EJB remotos: conexión a beans de sesión sin estado remotos
  • JABÓN

Apache CXF proporciona integración con Spring Framework para la exportación de objetos al estilo RPC en el lado del servidor. [99]

La configuración del cliente y del servidor para todos los protocolos y productos de estilo RPC compatibles con el marco de acceso remoto Spring (excepto la compatibilidad con Apache Axis) se configura en el contenedor Spring Core.

Existe una implementación alternativa de código abierto (Cluster4Spring) de un subsistema de comunicación remota incluido en Spring Framework que está diseñado para soportar varios esquemas de comunicación remota (1-1, 1-muchos, descubrimiento dinámico de servicios). [ cita requerida ]

Desarrollo rápido de aplicaciones mediante convención sobre configuración

Bota de primavera

Spring Boot Extension es la solución de Spring que permite crear aplicaciones independientes basadas en Spring de nivel de producción [100] que se pueden "ejecutar sin más". [101] Está preconfigurada con la "visión opinada" del equipo de Spring [102] [103] sobre la mejor configuración y uso de la plataforma Spring y bibliotecas de terceros, de modo que puede comenzar con un mínimo de complicaciones. La mayoría de las aplicaciones Spring Boot necesitan muy poca configuración de Spring. [104]

Características principales:

  • Crear aplicaciones Spring independientes
  • Incruste Tomcat o Jetty [105] directamente (sin necesidad de implementar archivos WAR )
  • Proporcionar modelos de objetos de proyecto (POM) 'de inicio' con opiniones para simplificar su configuración de Maven / Gradle [106]
  • Configurar Spring automáticamente siempre que sea posible [107]
  • Proporcionar funciones listas para producción [100] como métricas , [108] controles de estado [108] y configuración externalizada [109]
  • No se requiere absolutamente ninguna generación de código [105] y no se requiere [106] configuración XML. [110]
  • Integración fluida y compatible con todos los patrones de integración empresarial.

Canguro de primavera

Spring Roo es un proyecto comunitario que ofrece un enfoque alternativo basado en la generación de código que utiliza convenciones en lugar de configuración para crear rápidamente aplicaciones en Java . Actualmente es compatible con Spring Framework, Spring Security y Spring Web Flow . Roo se diferencia de otros marcos de desarrollo rápido de aplicaciones al centrarse en:

  • Extensibilidad (mediante complementos)
  • Productividad de la plataforma Java (a diferencia de otros lenguajes)
  • Prevención de bloqueos (Roo se puede eliminar en pocos minutos desde cualquier aplicación)
  • Evitar el tiempo de ejecución (con las ventajas de implementación asociadas)
  • Usabilidad (particularmente a través de las características del shell y los patrones de uso)

Marco de trabajo por lotes

Spring Batch es un marco para el procesamiento por lotes que proporciona funciones reutilizables que son esenciales para procesar grandes volúmenes de registros, entre ellas:

  • registro / rastreo
  • Gestión de transacciones
  • Estadísticas de procesamiento de trabajos [111]
  • reinicio del trabajo

Proporciona servicios y funciones técnicas más avanzadas que permiten trabajos por lotes de gran volumen [112] y alto rendimiento [111] mediante técnicas de optimización y partición [111] .

Spring Batch ejecuta una serie de trabajos; un trabajo consta de muchos pasos y cada paso consta de una tarea de "LECTURA-PROCESAMIENTO-ESCRITURA" o una tarea de operación única (tasklet). Una tarea de operación "única" también se conoce como tasklet. [113] Significa realizar una sola tarea solamente, como limpiar los recursos antes o después de que se inicie o complete un paso.

El proceso "LEER-PROCESAR-ESCRIBIR" consta de estos pasos: "leer" datos de un recurso ( valores separados por comas (CSV), XML o base de datos), "procesarlos" y luego "escribirlos" en otros recursos (CSV, XML o base de datos). Por ejemplo, un paso puede leer datos de un archivo CSV, [113] procesarlos y escribirlos en la base de datos. Spring Batch proporciona muchas clases para leer/escribir CSV, XML y bases de datos. [114]

Los pasos se pueden encadenar para ejecutarse como un trabajo. [113]

Marco de integración

Spring Integration es un marco para la integración de aplicaciones empresariales que proporciona funciones reutilizables esenciales para arquitecturas basadas en mensajería o eventos .

  • enrutadores: enrutan un mensaje a un canal de mensajes según condiciones [115]
  • Transformadores: convierte/transforma/cambia la carga útil del mensaje y crea un nuevo mensaje con la carga útil transformada [116]
  • adaptadores – se integra con otras tecnologías y sistemas (HTTP, AMQP (Advanced Message Queuing Protocol), [117] JMS (Java Message Service), XMPP (Extensible Messaging and Presence Protocol), SMTP (Simple Mail Transfer Protocol), [118] IMAP (Internet Message Access Protocol), FTP (File Transfer Protocol) así como FTPS / SFTP , sistemas de archivos, etc.)
  • Filtros: filtra un mensaje según unos criterios. Si no se cumplen los criterios, el mensaje se descarta. [119]
  • Activadores de servicio: invocan una operación en un objeto de servicio. Spring admite el uso de la anotación @ServiceActivatorpara declarar el componente que requiere esta funcionalidad. [120]
  • Gestión y auditoría
  • gateways - expone una interfaz al cliente para los servicios solicitados. Un middleware de mensajería es responsable de proporcionar esta interfaz. Esta interfaz desacopla el middleware de mensajería del cliente ocultando las API de integración de Spring o JMS subyacentes. Los gateways están relacionados con el patrón Facade . La clase Integration de Spring, SimpleMessagingGateway, proporciona soporte esencial para gateways. SimpleMessagingGatewaypermite que la aplicación Spring especifique el canal que envía solicitudes y el canal que espera recibir respuestas. El objetivo principal de SimpleMessagingGatewayes tratar con cargas útiles, lo que evita al cliente los intrincados detalles de los mensajes transmitidos y recibidos. SimpleMessagingGatewayse utiliza junto con canales para permitir la integración con sistemas de archivos, JMS, correo electrónico o cualquier otro sistema que requiera cargas útiles y canales. [121]
  • splitter - Separa una carga útil grande en cargas útiles más pequeñas para admitir diferentes flujos de procesamiento. El splitter se logra en Spring utilizando el componente splitter. El componente splitter generalmente reenvía los mensajes a clases con una funcionalidad más especializada. Spring admite la @Splitteranotación para declarar el componente que requiere esta funcionalidad. [122]
  • Agregador: se utiliza para combinar muchos mensajes en un único resultado. En términos generales, el agregador es el reverso del divisor. El agregador publica un único mensaje para todos los componentes posteriores. Spring admite la @Aggregatoranotación para declarar el componente que requiere esta funcionalidad. [122]

Spring Integration admite arquitecturas basadas en tuberías y filtros.

WebSocket de primavera

Una regla esencial para manejar flujos de datos de manera efectiva es no bloquear nunca. [123] El WebSocket es una solución viable para este problema. [123] El protocolo WebSocket es un protocolo de transporte de bajo nivel que permite canales de comunicación full-duplex a través de una conexión TCP . El WebSocket actúa como una alternativa a HTTP para permitir la comunicación bidireccional entre el cliente y el servidor. El WebSocket es especialmente útil para aplicaciones que requieren intercambios frecuentes y rápidos de pequeños fragmentos de datos, a gran velocidad y volumen. [123]

Spring admite el protocolo WebSocket al proporcionar la API WebSocket para la aplicación reactiva. La @EnableWebSocketanotación brinda la funcionalidad de procesamiento de solicitudes WebSocket cuando se coloca en una clase de configuración de Spring. Una interfaz obligatoria es la WebSocketConfigurerque otorga acceso a WebSocketConfigurer. Luego, la URL de WebSocket se asigna a los controladores relevantes implementando el método registerWebSocketHandlers(WebSocketHandlerRegistry). [124]

WebFlux de primavera

Spring WebFlux es un marco que sigue el paradigma de programación funcional, diseñado para crear aplicaciones reactivas de Spring. Este marco utiliza ampliamente la programación funcional y los flujos reactivos. Un buen caso de uso para Spring WebFlux es para aplicaciones que requieren enviar y recibir información instantánea, como una aplicación web con capacidades de chat. [125]

Aunque las aplicaciones que utilizan la tecnología Spring WebFlux suelen ser menos legibles que sus contrapartes MVC, son más resistentes y más simples de ampliar. [126] Spring WebFlux reduce la necesidad de lidiar con las complicaciones asociadas con la sincronización del acceso a los subprocesos. [126]

Spring WebFlux admite eventos enviados por el servidor (SSE), que es una tecnología de envío de mensajes al servidor que permite al cliente obtener actualizaciones automáticas de un servidor a través de una conexión HTTP. Esta comunicación es unidireccional y comparte muchas similitudes con el modelo de publicación/suscripción que se encuentra en JMS. [123]

Relación con Jakarta Enterprise Beans (EJB)

El contenedor se puede convertir en un contenedor EJB (Enterprise JavaBeans) 3.0 parcialmente compatible mediante el proyecto Pitchfork. [ cita requerida ] Algunos [ ¿ quiénes? ] critican a Spring Framework por no cumplir con los estándares. [127] [ verificación fallida ] Sin embargo, SpringSource no ve el cumplimiento de EJB 3 como un objetivo principal y afirma que Spring Framework y el contenedor permiten modelos de programación más potentes. [128] [ verificación fallida ]

Vulnerabilidad de Spring4Shell

En abril de 2022 se publicó una vulnerabilidad de ejecución de código remoto que afectaba a ciertas versiones de Spring Framework bajo el código CVE - 2022-22965. Se le dio el nombre de Spring4Shell en referencia a la reciente vulnerabilidad Log4Shell , ambas con pruebas de concepto similares en las que los atacantes podían obtener acceso al shell [129] o incluso control total en máquinas vulnerables. [130]

Véase también

Citas

  1. ^ "Versión v6.1.4".
  2. ^ abc Deinum et al. 2014, p. 47, §2 Tareas principales de primavera.
  3. ^ Deinum et al. 2014, págs. 694–698, §16-2 Integración de dos sistemas utilizando JMS.
  4. ^ abcdefghijklmnopqrstu vwxyz aa ab ac ad ae Johnson & Hoeller 2004.
  5. ^ Deinum & Cosmina 2021, p. 1, §1 Creación de un entorno de desarrollo local.
  6. ^ "Spring Framework 1.0 Final Released". Blog oficial de Spring Framework . 24 de marzo de 2014 . Consultado el 1 de marzo de 2021 .
  7. ^ Ganadores del Jolt 2006
  8. ^ "Ganador del premio JAX Innovation Award 2006". Archivado desde el original el 17 de agosto de 2009. Consultado el 12 de agosto de 2009 .
  9. ^ "Spring Framework 3.2.5 Released". Sitio web oficial de Spring . 7 de noviembre de 2013 . Consultado el 16 de octubre de 2016 .
  10. ^ "Anuncio del lanzamiento de Spring Framework 4.0 GA". Blog de primavera. 12 de diciembre de 2013.
  11. ^ Walls 2016, págs. 92–106, §5.
  12. ^ Cosmina et al. 2017, págs. 125–126, §4 Configuración de Spring en detalle y Spring Boot.
  13. ^ Cosmina y col. 2017, págs. 1–18, §1 Presentación de la primavera.
  14. ^ "Spring Framework 4.2 ya está disponible". Blog de primavera. 31 de julio de 2015.
  15. ^ ab "Spring Framework 4.2 ya está disponible". Blog de Spring.
  16. ^ "Versiones de Spring Framework: versiones compatibles". github.com .
  17. ^ "Primavera reactiva". Blog de primavera. 9 de febrero de 2016.
  18. ^ "Spring Framework 6.0 ya está disponible". Blog de primavera. 16 de noviembre de 2022.
  19. ^ Muros 2019, pág. 48.
  20. ^ Documentación de Spring Framework para el contenedor principal
  21. ^ ab Johnson et al. 2005, Capítulo §2 - La fábrica de frijoles y el contexto de aplicación.
  22. ^ Deinum y otros. 2014, pág. 137, §3-1 Uso de Java Config para configurar POJO.
  23. ^ ab Johnson & Hoeller 2004, pág. 150, Presentación del marco Spring: la fábrica de beans principal.
  24. ^ abcdefg Deinum & Cosmina 2021, págs. 22–25, §2 Fundamentos de Spring Framework - El marco de Spring.
  25. ^ Walls 2016, pág. 240, §Apéndice D Dependencias de Spring Boot.
  26. ^ Johnson et al. 2005, Capítulo §1 Introducción al marco Spring - Resumen del módulo.
  27. ^ Johnson et al. 2005, Capítulo §4 - Primavera y AOP.
  28. ^ Deinum y otros. 2014, págs. 196–198, §3-17 Introducciones de AOP para POJO.
  29. ^ Johnson et al. 2005, Sistema de seguridad Acegi para Spring.
  30. ^ Deinum y otros. 2014, pág. 331, §7 Seguridad de primavera.
  31. ^ Muros 2019, págs. 56–59.
  32. ^ abcdef Deinum et al. 2014, págs. 419–426, §10 Acceso a datos.
  33. ^ Deinum et al. 2014, págs. 677–681, §15-4 Crear POJO controlados por mensajes en Spring.
  34. ^ Johnson et al. 2005, Capítulo §12 - Marco Web MVC.
  35. ^ a b C Deinum et al. 2014, pág. 217, §4 Primavera @MVC.
  36. ^ Deinum et al. 2014, págs. 525–534, §12-3 Cómo escribir un ItemWriter y un ItemReader personalizados.
  37. ^ Deinum et al. 2014, págs. 627–632, §14-7 Exponer e invocar servicios a través de RMI; §14-8 Exponer e invocar servicios a través de HTTP.
  38. ^ Deinum et al. 2014, págs. 641–658, §14-10 Introducción a la contratación de primeros servicios web SOAP, §14-11 Exponer e invocar servicios web SOAP con Spring-WS, §14-12 Desarrollar servicios web SOAP con Spring-WS y XML Marshalling.
  39. ^ Johnson et al. 2005, Capítulo §8 - Comunicación remota ligera.
  40. ^ ab Johnson et al. 2005, Capítulo §9 - Servicios de apoyo.
  41. ^ Deinum y otros. 2014, pág. 475, §11 Gestión de transacciones de primavera.
  42. ^ Deinum et al. 2014, p. 591, §14 Servicios empresariales Spring Java y tecnologías remotas.
  43. ^ Deinum et al. 2014, págs. 737–739, §17-3 Pruebas unitarias de controladores Spring MVC.
  44. ^ Deinum et al. 2014, págs. 739–743, §17-4 Gestión de contextos de aplicación en pruebas de integración.
  45. ^ Musib 2022, pág. 358, §8.3 Presentación de Spring WebFlux.
  46. ^ Cosmina y col. 2017, pág. 21-23.
  47. ^ Cosmina et al. 2017, págs. 24-25, §2 Acceso a módulos Spring mediante Maven.
  48. ^ Cosmina et al. 2017, p. 26, §2 Acceso a módulos Spring usando Gradle.
  49. ^ ab Deinum et al. 2014, págs. 53–62, §2-2 Cree POJO invocando un constructor.
  50. ^ ab Deinum et al. 2014, págs. 48–52, §2-1 Administrar y configurar POJO con el contenedor Spring IoC.
  51. ^ Deinum et al. 2014, págs. 59–67, §2-3 Utilice referencias POJO, cableado automático e importaciones para interactuar con otros POJO.
  52. ^ Deinum et al. 2014, págs. 112-116, §2-16 Utilice editores de propiedades en Spring.
  53. ^ ab Walls 2019, págs. 4–6, §1.1 Primeros pasos con Spring: ¿Qué es Spring?
  54. ^ Cosmina y col. 2017, pág. 37, §3 Presentación de IoC y DI en primavera.
  55. ^ ¿ Cuál es la diferencia entre depencylookup y la inyección de dependencia? - Foro de Spring. Forum.springsource.org (28 de octubre de 2009). Consultado el 24 de noviembre de 2013.
  56. ^ Deinum & Cosmina 2021, págs. 26–32, §2 Fundamentos de Spring Framework: inyección de dependencias.
  57. ^ ab Johnson & Hoeller 2004, págs. 135–137, §6 Contenedores livianos e inversión de control - Contenedores IOC.
  58. ^ Deinum et al. 2014, págs. 145–151, §3-3 Utilice referencias POJO y cableado automático para interactuar con otros POJO.
  59. ^ abc Cosmina et al. 2017, págs. 112–120, §3 Introducción de IoC y DI en Spring - Autowiring Your Beans.
  60. ^ abc Deinum et al. 2014, págs. 151–154, §3-4 Cablear automáticamente los POJO con las anotaciones @Resource y @Inject.
  61. ^ Deinum et al. 2014, págs. 99–104, §2-12 Programación orientada a aspectos.
  62. ^ abc Deinum et al. 2014, págs. 492–494, §11-6 Gestión de transacciones de forma declarativa con la anotación @Transactional.
  63. ^ Deinum et al. 2014, págs. 509–510, §11-11 Gestión de transacciones con entrelazado en tiempo de carga.
  64. ^ Configuración XML de Spring AOP
  65. ^ Configuración de anotaciones de AspectJ
  66. ^ Deinum et al. 2014, págs. 441–446, §10-5 Manejo de excepciones en el marco JDBC de Spring.
  67. ^ Deinum y otros. 2014, págs. 426–441, 463–465.
  68. ^ Hibernación vs. Primavera
  69. ^ Deinum et al. 2014, págs. 463–466, §10-8 Objetos persistentes con plantillas ORM de Spring.
  70. ^ Deinum et al. 2014, págs. 446–462, §10-6 Problemas con el uso directo de marcos ORM.
  71. ^ "Spring Data JPA para la abstracción de consultas". 6 de febrero de 2018. Consultado el 6 de febrero de 2018 .
  72. ^ ab Deinum et al. 2014, págs. 456–460, §10-7 Configuración de fábricas de recursos ORM en Spring.
  73. ^ abcd Deinum et al. 2014, págs. 464–468, §11-2 Elección de una implementación de administrador de transacciones.
  74. ^ ab Deinum et al. 2014, págs. 494–499, §11-7 Configuración del atributo de transacción de propagación.
  75. ^ Deinum et al. 2014, págs. 482–484, §11-2 Elección de una implementación de administrador de transacciones.
  76. ^ Deinum et al. 2014, págs. 484–486, §11-3 Gestión de transacciones mediante programación con la API del Administrador de transacciones.
  77. ^ Deinum et al. 2014, págs. 486–489, §11-4 Gestión de transacciones mediante programación con una plantilla de transacción.
  78. ^ Deinum et al. 2014, págs. 677–685, §15-4 Crear POJO controlados por mensajes en Spring.
  79. ^ Deinum et al. 2014, págs. 685–686, §15-5 Conexiones JMS de caché y de grupo.
  80. ^ Introducción al framework Spring
  81. ^ Johnson, Diseño y desarrollo J2EE uno a uno de expertos, cap. 12. et al.
  82. ^ Patrones de arquitectura de aplicaciones empresariales: controlador frontal
  83. ^ abcdefg Deinum et al. 2014, págs. 217–232, §4-1 Desarrollo de una aplicación web simple con Spring MVC.
  84. ^ Deinum & Cosmina 2021, págs. 82–83, §4 Arquitectura Spring MVC: resumen del procesamiento de solicitudes.
  85. ^ Deinum et al. 2014, págs. 217–219, §4-1 Desarrollo de una aplicación web simple con Spring MVC.
  86. ^ Muros 2019, págs. 18-19.
  87. ^ ab Deinum et al. 2014, págs. 236–239, §4-3 Interceptación de solicitudes con interceptores de controlador.
  88. ^ Deinum y otros. 2014, págs. 239–240, §4-4 Resolución de configuraciones regionales del usuario.
  89. ^ Deinum & Cosmina 2021, págs. 75–76, §4 Arquitectura Spring MVC: preparar una solicitud.
  90. ^ ab Deinum et al. 2014, págs. 243–247, §4-6 Resolución de vistas por nombres.
  91. ^ Deinum & Cosmina 2021, p. 81, §4 Arquitectura Spring MVC - Renderizar una vista.
  92. ^ Deinum y otros. 2014, pág. 723, §17 Pruebas de primavera.
  93. ^ abc Deinum & Cosmina 2021, págs. 73–74, §4 Arquitectura Spring MVC - Flujo de trabajo de procesamiento de solicitudes de DispatcherServlet.
  94. ^ ab Walls 2019, pág. 35.
  95. ^ abcdef Deinum & Cosmina 2021, págs. 84–90, §4 Arquitectura Spring MVC: arranque de DispatcherServlet.
  96. ^ abc Deinum et al. 2014, págs. 627–632, §14-7 Exponer e invocar servicios a través de RMI.
  97. ^ ab Deinum et al. 2014, págs. 632–635, §14-8 Exponer e invocar servicios a través de HTTP.
  98. ^ Deinum et al. 2014, págs. 692–694, §16-1 Integración de un sistema con otro utilizando EAI.
  99. ^ ab Deinum et al. 2014, págs. 635–641, §14-9 Exponer e invocar servicios web SOAP con JAX-WS.
  100. ^ ab Walls 2016, p. vii, §prólogo.
  101. ^ "Bota de primavera". spring.io.
  102. ^ Muros 2016, pág. 48, §2.4.
  103. ^ Deinum & Cosmina 2021, págs. 21-22, §2 Fundamentos de Spring Framework.
  104. ^ Walls 2016, págs. 37–48, §2.3.
  105. ^ ab Walls 2016, pág. 7, §1.1.3.
  106. ^ ab Walls 2016, p. x, §Prefacio.
  107. ^ Walls 2016, págs. 4–5, §1.1.2.
  108. ^ ab Walls 2016, págs. 124–139, §7.
  109. ^ Walls 2016, págs. 49–69, §3.1-§3.2.3.
  110. ^ "Acerca de Spring Boot" . Consultado el 18 de marzo de 2020 .
  111. ^ abc Deinum et al. 2014, págs. 536–541, §12-7 Control de la ejecución de pasos.
  112. ^ Deinum et al. 2014, págs. 714–717, §16-9 Preparación de eventos mediante Spring Batch.
  113. ^ abc Deinum et al. 2014, págs. 518–524, §12-2 Lectura y escritura.
  114. ^ Deinum y otros. 2014, págs. 511–512, §12 Lote de primavera.
  115. ^ Deinum et al. 2014, págs. 713–714, §16-8 Enrutamiento condicional con enrutadores.
  116. ^ Deinum et al. 2014, págs. 704–707, §16-5 Transformación de un mensaje de un tipo a otro.
  117. ^ Deinum et al. 2014, págs. 686–690, §15-6 Enviar y recibir mensajes AMQP con Spring.
  118. ^ Deinum et al. 2014, pp. 613–620, §14-4 Enviar correo electrónico con el soporte de correo electrónico de Spring.
  119. ^ Deinum et al. 2014, p. 406, §9-2 Uso de Spring en sus servlets y filtros.
  120. ^ Deinum et al. 2014, págs. 695–698, §16-2 Integración de dos sistemas utilizando JMS.
  121. ^ Deinum y otros. 2014, págs. 717–722, §16-10 Uso de puertas de enlace.
  122. ^ ab Deinum et al. 2014, págs. 710–713, §16-7 Control de integración de bifurcación: divisores y agregadores.
  123. ^ abcd Deinum & Cosmina 2021, págs. 422–425, §11 El protocolo WebSocket.
  124. ^ Deinum & Cosmina 2021, págs. 425–432, §11 El protocolo WebSocket.
  125. ^ Deinum & Cosmina 2021, p. 369, §10 Creación de aplicaciones reactivas con Spring WebFlux.
  126. ^ ab Deinum & Cosmina 2021, p. 421, §11 Protección de aplicaciones Spring WebFlux.
  127. ^ Primavera VS EJB3
  128. ^ "Preguntas frecuentes sobre Pitchfork" . Consultado el 6 de junio de 2006 .
  129. ^ "Spring4Shell: vulnerabilidad crítica en Spring - blog oficial de Kaspersky".
  130. ^ Chirgwin, Richard (4 de abril de 2022). "VMware se vio afectado por la vulnerabilidad de Spring4shell". itnews.com.au. Archivado desde el original el 13 de febrero de 2024. Consultado el 13 de febrero de 2024 .

Referencias

  • Cosmina, Juliana; Harrop, Rob; Schaefer, Chris; Ho, Clarence (2017). Pro Primavera 5 . Berkeley, CA: Apress. doi :10.1007/978-1-4842-2808-1. ISBN 978-1-4842-2807-4.
  • Deinum, Marta; Cosmina, Juliana (2021). Pro Spring MVC con WebFlux . Berkeley, CA: Apress. doi :10.1007/978-1-4842-5666-4. ISBN 978-1-4842-5665-7.
  • Deinum, Marten; Long, Josh; Mak, Gary; Rubio, Daniel (2014). Recetas de primavera . Berkeley, CA: Apress. doi :10.1007/978-1-4302-5909-1. ISBN. 978-1-4302-5908-4.
  • Johnson, Rod; Höller, Jürgen; Arendsen, Alef; Risberg, Thomas; Sampaleanu, Colin (8 de julio de 2005). Desarrollo profesional en Java con el marco Spring (primera edición). Wrox Press . p. 672. ISBN 0-7645-7483-3.
  • Harrop, Rob; Machacek, Jan (31 de enero de 2005). Pro Spring (Primera ed.). Presione . pag. 832.ISBN 1-59059-461-4.
  • Johnson, Rod; Jürgen, Höller (23 de octubre de 2002). Desarrollo de J2EE sin EJB (primera edición). Wrox Press . p. 768. ISBN 0-7645-5831-5.
  • Johnson, Rod; Jurgen, Holler (octubre de 2002). Diseño y desarrollo J2EE personalizado por expertos (primera edición). Wrox Press . p. 750. ISBN 0-7645-4385-7.
  • Johnson, varilla; Hoeller, Jürgen (2004). Desarrollo experto J2EE uno a uno sin EJB . Indianápolis, Indiana: Wiley. ISBN 978-0-7645-5831-3.
  • Musib, Somnath (12 de julio de 2022). Spring Boot in Practice . Simon and Schuster. ISBN 978-1-61729-881-3.
  • Pollack, Mark; Gierke, Oliver; Risberg, Thomas; Brisbin, Jon; Hunger, Michael (31 de octubre de 2012). Spring Data (Primera edición). O'Reilly . p. 316. ISBN 978-1449323950.
  • Sarin, Ashish (27 de junio de 2016). Introducción a Spring Framework (tercera edición). Autoedición . p. 626. ISBN 978-1534985087.
  • Long, Josh (27 de agosto de 2013). Spring Framework LiveLessons (primera edición). Addison-Wesley Professional . pp. 4+ horas. ISBN 978-0-13-346307-1.
  • Walls, Craig (3 de enero de 2016). Spring Boot in Action . Manning . ISBN 978-1-61729-254-5.
  • Walls, Craig (2019). Primavera en acción . Manning . ISBN. 978-1-61729-494-5.
  • "Ganador del premio JAX Innovation Award 2006". Archivado desde el original el 17 de agosto de 2009. Consultado el 12 de agosto de 2009 .
  • "Preguntas frecuentes sobre Pitchfork" . Consultado el 6 de junio de 2006 .
  • "Anuncio del lanzamiento de Spring Framework 4.0 GA". Blog de primavera. 12 de diciembre de 2013.
  • Sitio web oficial
  • Tutoriales de primavera
Obtenido de "https://es.wikipedia.org/w/index.php?title=Spring_Framework&oldid=1245412483"