Spring Boot vs Spring MVC vs Spring - ¿Cómo se comparan?

Spring Boot vs Spring MVC vs Spring - ¿Cómo se comparan?


imagen

Primavera, Spring Boot, Spring MVC, ¡en todas partes está la palabra "primavera"! Veamos dónde y cuándo puedes usar cada una de estas herramientas.


En este artículo, verá revisiones: Spring, Spring MVC y Spring Boot, descubrirá qué problemas resuelven y dónde se aplican mejor. El hecho más importante que aprende es que Spring, Spring MVC y Spring Boot no compiten por el mismo lugar. Resuelven diferentes problemas y los resuelven muy bien.

¿Cuál es el principal problema que resuelve este Spring Framework?


Piensa mucho y mucho. ¿Cuál es el problema resuelto por Spring Framework?

¿Por qué es esto importante? Porque cuando DI o IOC se usan correctamente, podemos desarrollar aplicaciones poco acopladas. Y las aplicaciones acopladas libremente se pueden probar fácilmente con pruebas unitarias.

Veamos un ejemplo simple.

Un ejemplo sin inyección de dependencia


Considere el siguiente ejemplo: WelcomeController depende del WelcomeService para recibir un mensaje de bienvenida. ¿Qué hace para obtener una instancia de WelcomeService?

WelcomeService service = new WelcomeService(); 

Esta línea crea una instancia de este servicio. Y esto significa que están fuertemente conectados. Por ejemplo, si creo un simulacro para WelcomeService en la prueba de unidad para WelcomeController, ¿cómo consigo que WelcomeController use el simulacro? No es facil!

 @RestController public class WelcomeController { private WelcomeService service = new WelcomeService(); @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } } 

Ejemplo de inyección de dependencia simple


El mundo se ve mucho más fácil con la inyección de dependencia. Dejas que Spring Framework haga el trabajo duro. Solo usamos dos anotaciones simples: Componente y Autowired .

  • Usando Componente , decimos Spring Framework: Hola, este es el contenedor que debes administrar.
  • Usando Autowired , decimos Spring Framework: Hey, encuentre la combinación adecuada para este tipo particular y conéctelo.

En el ejemplo a continuación, Spring Framework creará un bean para WelcomeService y lo conectará a WelcomeController.

En la prueba unitaria, puedo pedirle a Spring Framework que conecte la simulación WelcomeService al WelcomeController. (Spring Boot facilita las cosas al hacer esto con la anotación @MockBean. ¡Pero esa es otra historia!)

 @Component public class WelcomeService { //Bla Bla Bla }@RestController public class WelcomeController { @Autowired private WelcomeService service; @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } } 

¿Qué más resuelve el Spring Framework?


Problema 1: duplicación de código / contaminación


¿Spring Framework se detiene con la inyección de dependencia? No Se basa en el concepto básico de inyección de dependencia con múltiples módulos Spring.

  • Spring jdbc
  • Mvc de primavera
  • Primavera aop
  • Orma de primavera
  • Primavera jms
  • Prueba de primavera

Detengámonos en Spring JMS y Spring JDBC por un momento.

¿Estos módulos traen nuevas funcionalidades? No Podemos hacer todo esto en J2EE o Java EE. Entonces, ¿qué traen? Traen abstracciones simples. El propósito de estas abstracciones es:

  • Reducir código repetitivo / Reducir duplicación
  • Promueva la desconexión / amplíe la capacidad de prueba

Por ejemplo, necesita mucho menos código para usar JDBCTemplate o JMSTemplate en comparación con JDBC o JMS tradicionales.

Problema 2: buena integración con otros marcos


Lo mejor de Spring Framework es que no está tratando de resolver problemas que ya se han resuelto. Todo lo que hace es proporcionar una excelente integración con otros marcos, que a su vez proporcionan excelentes soluciones.

  • Hibernar para ORM
  • iBatis para el mapeo de objetos
  • JUnit y Mockito para pruebas unitarias

¿Por qué necesitamos botas de primavera?


Las aplicaciones basadas en Spring tienen muchas configuraciones.

Cuando usamos Spring MVC, necesitamos configurar: escaneo de componentes, servlet de despachador, resolución de vista, tarros web (para entregar contenido estático) entre otras cosas.

 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean><mvc:resources mapping="/webjars/**" location="/webjars/"/> 

El siguiente código muestra una configuración típica de servlet de despachador en una aplicación web.

 <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/todo-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet><servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 

Cuando usamos Hibernate / JPA, necesitamos configurar la fuente de datos, la fábrica del administrador de entidades, el administrador de transacciones y otras cosas.

 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean><jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:config/schema.sql" /> <jdbc:script location="classpath:config/data.sql" /> </jdbc:initialize-database><bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="hsql_pu" /> <property name="dataSource" ref="dataSource" /> </bean><bean id="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="dataSource" ref="dataSource" /> </bean><tx:annotation-driven transaction-manager="transactionManager"/> 

Problema 1: Configuración automática de Spring Boot: ¿podemos pensar de manera diferente?


Spring Boot trae un nuevo proceso de pensamiento en torno a todo.

  • ¿Qué pasa con la configuración automática de la fuente de datos si el jar de Hibernate está en el classpath?
  • ¿Qué pasa con la configuración automática de un Servlet Dispatcher si Spring MVC jar está en classpath?

Luego habrá disposiciones para anular la configuración automática predeterminada.

Problema 2: Proyectos de arranque de arranque de primavera: construidos alrededor de patrones bien conocidos


Digamos que queremos desarrollar una aplicación web.

En primer lugar, necesitamos determinar los marcos que queremos usar, qué versiones usar y cómo conectarlos.

Todas las aplicaciones web tienen necesidades similares. Las siguientes dependencias se utilizan en Spring MVC. Estos incluyen Spring MVC, Jackson Databind, Hibernate-Validator y Log4j.

 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.2.RELEASE</version> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency><dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.2.Final</version> </dependency><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> 

Si desea desarrollar una aplicación web o una aplicación para servicios RESTful, su elección es Spring Boot Start Web. Creemos rápidamente un proyecto con Spring Boot Starter Web usando Spring Initializr.

Dependencias para Spring Boot Starter Web


 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 

La siguiente captura de pantalla muestra las diversas dependencias que se han agregado a nuestra aplicación.

imagen

Las dependencias se pueden clasificar en:

  • Primavera: núcleo, frijoles, contexto, aop
  • Web MVC: (Spring MVC)
  • Jackson: para comunicación JSON
  • Validación: Validador de Hibernación, API de Validación
  • Contenedor de servlet integrado: Tomcat
  • Registro: logback, slf4j

Cualquier aplicación web típica utilizará todas estas dependencias. Spring Boot Starter Web viene con ellos. Como desarrollador, no necesito preocuparme por estas dependencias o versiones compatibles.

Opciones de proyecto Spring Boot Starter


Como podemos ver en Spring Boot Starter Web, los proyectos iniciales nos ayudan a comenzar rápidamente a desarrollar ciertos tipos de aplicaciones.

  • spring-boot-starter-web-services: servicios web SOAP
  • spring-boot-starter-web: aplicaciones web y RESTful
  • spring-boot-starter-test: pruebas unitarias y pruebas de integración
  • spring-boot-starter-jdbc: JDBC tradicional
  • spring-boot-starter-hateoas: Agregue funciones HATEOAS a sus servicios
  • spring-boot-starter-security: autenticación y autorización con Spring Security
  • spring-boot-starter-data-jpa: Spring Data JPA con Hibernate
  • spring-boot-starter-cache: habilitación del soporte de almacenamiento en caché de Spring Framework
  • spring-boot-starter-data-rest: proporcionar servicios REST simples utilizando Spring Data REST

Otros objetivos de Spring Boot


También hay varios entrantes para cosas técnicas:

  • Spring-boot-starter-actuator: para usar funciones avanzadas como monitorear y rastrear su aplicación de forma inmediata
  • spring-boot-starter-undertow, spring-boot-starter-jetty, spring-boot-starter-tomcat: para seleccionar un contenedor de servlet incorporado específico
  • spring-boot-starter-logging: para iniciar sesión utilizando logback
  • spring-boot-starter-log4j2: inicio de sesión con Log4j2

Spring Boot tiene como objetivo crear aplicaciones por períodos más cortos.

  • Actuador: permite el monitoreo y seguimiento avanzado de aplicaciones.
  • Integraciones de servidores integrados: dado que el servidor está integrado en la aplicación, necesito tener un servidor de aplicaciones separado instalado en el servidor
  • Manejo predeterminado de errores

Source: https://habr.com/ru/post/481914/


All Articles