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]
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 jakarta
espacio de nombres), con un enfoque en las API de Jakarta EE 10 lanzadas recientemente , como Servlet 6.0 y JPA 3.1. [18]
Spring Framework incluye varios módulos que brindan una variedad de servicios:
BeanFactory
y ApplicationContext
). [20] [21] [22] En este contexto, spring-core
el artefacto [23] se encuentra en el módulo principal [24] perteneciente al org.springframework
grupo. [25] El spring-core
artefacto consiste en el contenedor de IoC, así como las clases de utilidad [23] utilizadas en toda la aplicación. [26]spring-aop
un artefacto para el marco AOP. [24]spring-jdbc
es un artefacto que se encuentra en el módulo JDBC que admite el acceso JDBC al incluir clases de configuración de fuentes de datos. [24]spring-websocket
.spring-oxm
.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]
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.
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 @Configuration
es 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 @Bean
anotación. La ApplicationContext
interfaz devolverá entonces los objetos configurados con la @Bean
anotació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]
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]
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]
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.
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 @Qualifier
o ), [58] [59] y las anotaciones estándar de Java y . [60]@Primary
@Resource
@Inject
La @Qualifier
anotació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 @Primary
anotació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 @Resource
anotación es una anotación que cumple con JSR 250 , o Anotaciones comunes para la plataforma Java. La @Resource
anotación se utiliza para el cableado automático de referencias a POJO por nombre. [60] La @Inject
anotación es una anotación que cumple con JSR 300, o Anotaciones estándar para inyección. La @Inject
anotación se utiliza para el cableado automático de referencias a POJO por tipo. [60]
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:
@AspectJ
-estilo de anotación basado en [65] [ se necesita una mejor fuente ]<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).
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
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:
Datasource
me gusta com.mchange.v2.c3p0.ComboPooledDataSource
o org.apache.commons.dbcp.BasicDataSource
[32]SessionFactory
me gusta org.springframework.orm.hibernate3.LocalSessionFactoryBean
con un DataSource
atributo [72] [4] : 173 HibernateProperties
[4] : 173 me gustaorg.springframework.beans.factory.config.PropertiesFactoryBean
TransactionManager
me gusta org.springframework.orm.hibernate3.HibernateTransactionManager
con un SessionFactory
atributo [72]Otros puntos de configuración incluyen:
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:
JtaTransactionManager
[76] [4] : 255–257 y UserTransaction
[4] : 234 Además de este mecanismo de abstracción, el marco proporciona dos formas de agregar gestión de transacciones a las aplicaciones:
TransactionTemplate
[77]@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] .
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 DispatcherServlet
clase 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 Model
y View
para 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 Model
o 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. View
No debe contener ninguna lógica de negocios y solo debe presentar los datos encapsulados por el Model
. [35] Algunas solicitudes pueden ir directamente a View
sin pasar por la Model
parte ; otras pueden pasar por las tres.ViewResolver
: responsable de seleccionar un View
en 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 Model
expone 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.Map
interfaz Java como una abstracción orientada a datos para los valores Model
esperados 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.
Cuando un usuario hace clic en un enlace o envía un formulario en su navegador web, la solicitud va a Spring DispatcherServlet
. DispatcherServlet
es un controlador frontal en Spring MVC. [83] [93] El DispatcherServlet
es 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.Controller
o org.
springframework.stereotype.Controller
clases anotadas. [93] Consulta una o más asignaciones de controladores. [83] DispatcherServlet
elige un controlador apropiado y le reenvía la solicitud. El Controller
procesa 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 View
de una aplicación. [83] Toda la información está en el objeto Model
And . Cuando el controlador no está acoplado a una vista particular, encuentra el real (como JSP) con la ayuda de . [83] [4] : 390–391 View
DispatcherServlet
View
ViewResolver
A partir de la versión 3.0 de la Especificación de Servlet, hay algunas formas de configurar DispatcherServlet: [95]
web.xml
como 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>
web-fragment.xml
[95]javax.servlet.ServletContainerInitializer
[95] org.springframework.web.WebApplicationInitializer
interfaz. [95]SpringBootServletInitializer
clase .lm [95]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
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 ]
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:
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:
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:
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]
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 .
@ServiceActivator
para declarar el componente que requiere esta funcionalidad. [120]SimpleMessagingGateway
, proporciona soporte esencial para gateways. SimpleMessagingGateway
permite que la aplicación Spring especifique el canal que envía solicitudes y el canal que espera recibir respuestas. El objetivo principal de SimpleMessagingGateway
es tratar con cargas útiles, lo que evita al cliente los intrincados detalles de los mensajes transmitidos y recibidos. SimpleMessagingGateway
se 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
anotación para declarar el componente que requiere esta funcionalidad. [122]@Aggregator
anotación para declarar el componente que requiere esta funcionalidad. [122]Spring Integration admite arquitecturas basadas en tuberías y filtros.
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 @EnableWebSocket
anotació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 WebSocketConfigurer
que otorga acceso a WebSocketConfigurer
. Luego, la URL de WebSocket se asigna a los controladores relevantes implementando el método registerWebSocketHandlers(WebSocketHandlerRegistry). [124]
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]
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 ]
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]