Spring Boot vs Spring MVC vs Spring - Como eles se comparam?

Spring Boot vs Spring MVC vs Spring - Como eles se comparam?


imagem

Spring, Spring Boot, Spring MVC, em todos os lugares há a palavra “spring”! Vamos ver onde e quando você pode usar cada uma dessas ferramentas.


Neste artigo, você verá análises: Spring, Spring MVC e Spring Boot, descobre quais problemas eles resolvem e onde são melhor aplicados. O fato mais importante que você aprende é que Spring, Spring MVC e Spring Boot não competem pelo mesmo lugar. Eles resolvem problemas diferentes e os resolvem muito bem.

Qual é o principal problema que este Spring Framework resolve?


Pense muito e bem. Qual é o problema resolvido pelo Spring Framework?

Por que isso é importante? Como quando o DI ou o COI são usados ​​corretamente, podemos desenvolver aplicativos fracamente acoplados. E aplicações com acoplamentos frouxos podem ser facilmente testadas com testes de unidade.

Vejamos um exemplo simples.

Um exemplo sem injeção de dependência


Considere o exemplo abaixo: WelcomeController depende do WelcomeService para receber uma mensagem de boas-vindas. O que ele faz para obter uma instância do WelcomeService?

WelcomeService service = new WelcomeService(); 

Esta linha cria uma instância deste serviço. E isso significa que eles estão fortemente conectados. Por exemplo, se eu criar uma simulação para o WelcomeService no teste de unidade do WelcomeController, como faço para que o WelcomeController use a simulação? Não é fácil!

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

Exemplo simples de injeção de dependência


O mundo parece muito mais fácil com a injeção de dependência. Você deixou o Spring Framework fazer o trabalho duro. Apenas usamos duas anotações simples: Component e Autowired .

  • Usando Component , dizemos Spring Framework: Olá, esta é a lixeira que você precisa gerenciar.
  • Usando o Autowired , dizemos Spring Framework: Ei, encontre a combinação certa para esse tipo específico e conecte-o.

No exemplo abaixo, a estrutura do Spring criará um bean para o WelcomeService e o conectará ao WelcomeController.

No teste de unidade, posso solicitar à estrutura do Spring que conecte o mock do WelcomeService ao WelcomeController. (O Spring Boot facilita as coisas fazendo isso com a anotação @MockBean. Mas isso é outra história!)

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

O que mais o Spring Framework resolve?


Problema 1: Duplicação / Poluição de Código


O Spring Framework para com injeção de dependência? Não. Ele se baseia no conceito básico de injeção de dependência com vários módulos Spring.

  • Spring jdbc
  • Spring mvc
  • Spring aop
  • Orm da mola
  • Spring jms
  • Teste de mola

Vamos nos concentrar no Spring JMS e Spring JDBC por um momento.

Esses módulos trazem novas funcionalidades? Não. Podemos fazer tudo isso em J2EE ou Java EE. Então, o que eles trazem? Eles trazem abstrações simples. O objetivo dessas abstrações é:

  • Reduzir o código padrão / reduzir duplicação
  • Promover desconectar / ampliar a testabilidade

Por exemplo, você precisa de muito menos código para usar JDBCTemplate ou JMSTemplate em comparação com o JDBC ou JMS tradicional.

Problema 2: boa integração com outras estruturas


O melhor do Spring Framework é que ele não está tentando resolver problemas que já foram resolvidos. Tudo o que ele faz é fornecer uma excelente integração com outras estruturas, que por sua vez fornecem excelentes soluções.

  • Hibernate for ORM
  • iBatis para mapeamento de objetos
  • JUnit e Mockito para teste de unidade

Por que precisamos de bota de mola?


Os aplicativos baseados em mola têm muitas configurações.

Quando usamos o Spring MVC, precisamos configurar: varredura de componente, servlet do despachante, resolvedor de exibição, jars da web (para fornecer conteúdo estático) entre outras coisas.

 <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/"/> 

O código abaixo mostra uma configuração típica de servlet do dispatcher em um aplicativo da 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> 

Quando usamos o Hibernate / JPA, precisamos configurar a fonte de dados, a fábrica do gerenciador de entidades, o gerenciador de transações e outras coisas.

 <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: Configuração automática da inicialização por mola: podemos pensar de maneira diferente?


O Spring Boot traz um novo processo de pensamento em torno de tudo.

  • E a configuração automática da fonte de dados se o jar do Hibernate estiver no caminho de classe?
  • E a configuração automática de um Servlet Dispatcher se o jar do Spring MVC estiver no caminho de classe?

Depois, haverá disposições para substituir a configuração automática padrão.

Problema 2: Projetos iniciantes de inicialização por mola: criados em torno de padrões conhecidos


Digamos que queremos desenvolver um aplicativo da web.

Primeiro de tudo, precisamos determinar as estruturas que queremos usar, quais versões usar e como conectá-las.

Todos os aplicativos da web têm necessidades semelhantes. As seguintes dependências são usadas no Spring MVC. Isso inclui Spring MVC, Jackson Databind, Hibernate-Validator e 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> 

Se você deseja desenvolver um aplicativo Web ou um aplicativo para serviços RESTful, sua escolha é Spring Boot Start Web. Vamos criar rapidamente um projeto com o Spring Boot Starter Web usando o Spring Initializr.

Dependências para o Spring Boot Starter Web


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

A captura de tela a seguir mostra as várias dependências que foram adicionadas ao nosso aplicativo.

imagem

As dependências podem ser classificadas em:

  • Primavera: núcleo, feijão, contexto, aop
  • MVC da Web: (Spring MVC)
  • Jackson: para comunicação JSON
  • Validação: Hibernate Validator, Validation API
  • Contêiner de servlet incorporado: Tomcat
  • Log: logback, slf4j

Qualquer aplicativo Web típico utilizará todas essas dependências. O Spring Boot Starter Web vem com eles. Como desenvolvedor, não preciso me preocupar com essas dependências ou versões compatíveis.

Opções do projeto Spring Boot Starter


Como podemos ver na Web do Spring Boot Starter, os projetos iniciais nos ajudam a começar rapidamente a desenvolver certos tipos de aplicativos.

  • spring-boot-starter-web-services: Serviços da Web SOAP
  • spring-boot-starter-web: aplicativos Web e RESTful
  • spring-boot-starter-test: teste de unidade e teste de integração
  • spring-boot-starter-jdbc: JDBC tradicional
  • spring-boot-starter-hateoas: adicione recursos do HATEOAS aos seus serviços
  • spring-boot-starter-security: autenticação e autorização usando o Spring Security
  • spring-boot-starter-data-jpa: Spring Data JPA com Hibernate
  • spring-boot-starter-cache: Ativando o suporte a cache do Spring Framework
  • spring-boot-starter-data-rest: Fornecendo serviços REST simples usando o Spring Data REST

Outros objetivos do Spring Boot


Existem também várias entradas para assuntos técnicos:

  • spring-boot-starter-actuator: Para usar recursos avançados, como monitorar e rastrear seu aplicativo imediatamente
  • ressaca de inicialização de inicialização de mola, molhe de inicialização de inicialização de mola, tomcat de inicialização de inicialização de mola: Para selecionar um contêiner de servlet interno específico
  • spring-boot-starter-logging: Para fazer logon usando logback
  • spring-boot-starter-log4j2: Registrando usando Log4j2

O Spring Boot visa criar aplicativos por períodos mais curtos.

  • Atuador: permite monitoramento e rastreamento avançados de aplicativos.
  • Integrações de servidor incorporado: Como o servidor está integrado ao aplicativo, preciso ter um servidor de aplicativos separado instalado no servidor
  • Tratamento de erros padrão

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


All Articles