Spring Boot vs Spring MVC vs Spring - Wie vergleichen sie?

Spring Boot vs Spring MVC vs Spring - Wie vergleichen sie?


Bild

Frühling, Spring Boot, Spring MVC, überall gibt es das Wort "Frühling"! Lassen Sie uns durchgehen, wo und wann Sie jedes dieser Tools verwenden können.


In diesem Artikel finden Sie Rezensionen: Spring, Spring MVC und Spring Boot, um herauszufinden, welche Probleme sie lösen und wo sie am besten angewendet werden. Die wichtigste Tatsache, die Sie lernen, ist, dass Spring, Spring MVC und Spring Boot nicht um denselben Platz konkurrieren. Sie lösen verschiedene Probleme und sie lösen sie sehr gut.

Was ist das Hauptproblem, das dieses Spring Framework löst?


Überlege lange und gründlich. Was ist das Problem von Spring Framework gelöst?

Warum ist das wichtig? Denn wenn DI oder IOC richtig verwendet werden, können wir lose gekoppelte Anwendungen entwickeln. Locker gekoppelte Anwendungen können problemlos mit Unit-Tests getestet werden.

Schauen wir uns ein einfaches Beispiel an.

Ein Beispiel ohne Abhängigkeitsinjektion


Betrachten Sie das folgende Beispiel: WelcomeController benötigt den WelcomeService, um eine Willkommensnachricht zu erhalten. Was macht er, um eine Instanz von WelcomeService zu erhalten?

WelcomeService service = new WelcomeService(); 

Diese Zeile erstellt eine Instanz dieses Dienstes. Dies bedeutet, dass sie stark miteinander verbunden sind. Wenn ich beispielsweise im Komponententest für den WelcomeController einen Mock für WelcomeService erstelle, wie kann ich den WelcomeController dazu bringen, den Mock zu verwenden? Nicht leicht!

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

Einfaches Beispiel für die Abhängigkeitsinjektion


Die Welt sieht mit der Abhängigkeitsinjektion viel einfacher aus. Sie lassen das Spring Framework die harte Arbeit erledigen. Wir verwenden nur zwei einfache Annotationen: Component und Autowired .

  • Mit Component sagen wir Spring Framework: Hey, das ist der Behälter, den Sie verwalten müssen.
  • Mit Autowired sagen wir Spring Framework: Hey, finde die richtige Übereinstimmung für diesen bestimmten Typ und stecke sie ein.

Im folgenden Beispiel erstellt das Spring-Framework eine Bean für den WelcomeService und verbindet sie mit dem WelcomeController.

Im Unit-Test kann ich das Spring-Framework bitten, das WelcomeService-Mock mit dem WelcomeController zu verbinden. (Spring Boot erleichtert dies mit der @ MockBean-Annotation. Aber das ist eine andere Geschichte!)

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

Was löst das Spring Framework noch?


Problem 1: Code-Vervielfältigung / Verschmutzung


Stoppt Spring Framework mit der Abhängigkeitsinjektion? Nein. Es baut auf dem Grundkonzept der Abhängigkeitsinjektion mit mehreren Spring-Modulen auf.

  • Spring jdbc
  • Spring mvc
  • Frühling aop
  • Frühling orm
  • Frühling jms
  • Frühlingstest

Lassen Sie uns einen Moment bei Spring JMS und Spring JDBC verweilen.

Bringen diese Module neue Funktionen? Nein. Wir können das alles auf J2EE oder Java EE machen. Also, was bringen sie? Sie bringen einfache Abstraktionen. Der Zweck dieser Abstraktionen ist:

  • Boilerplate-Code reduzieren / Duplikation reduzieren
  • Testbarkeit beim Trennen / Erweitern fördern

Beispielsweise benötigen Sie viel weniger Code, um JDBCTemplate oder JMSTemplate im Vergleich zu herkömmlichem JDBC oder JMS zu verwenden.

Problem 2: gute Integration mit anderen Frameworks


Das Tolle am Spring Framework ist, dass es nicht versucht, bereits gelöste Probleme zu lösen. Alles, was er tut, ist eine hervorragende Integration mit anderen Frameworks, die wiederum hervorragende Lösungen bieten.

  • Ruhezustand für ORM
  • iBatis for Object Mapping
  • JUnit und Mockito für Unit-Tests

Warum brauchen wir Spring Boot?


Federbasierte Anwendungen haben viele Konfigurationen.

Wenn wir Spring MVC verwenden, müssen wir unter anderem Folgendes konfigurieren: Komponentenscan, Dispatcher-Servlet, View Resolver, Web-Jars (zur Bereitstellung statischer Inhalte).

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

Der folgende Code zeigt eine typische Konfiguration eines Dispatcher-Servlets in einer Webanwendung.

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

Wenn Sie Hibernate / JPA verwenden, müssen Sie die Datenquelle, die Entity Manager Factory, den Transaktionsmanager und andere Dinge konfigurieren.

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

Problem 1: Automatische Spring Boot-Konfiguration: Können wir anders denken?


Spring Boot bringt einen neuen Denkprozess um alles.

  • Was ist mit der automatischen Konfiguration der Datenquelle, wenn sich das Hibernate-Glas im Klassenpfad befindet?
  • Was ist mit der automatischen Konfiguration eines Dispatcher-Servlets, wenn sich die Spring-MVC-JAR im Klassenpfad befindet?

Dann gibt es Vorkehrungen, um die standardmäßige automatische Konfiguration zu überschreiben.

Problem 2: Spring Boot Starter-Projekte: Aufbauend auf bekannten Mustern


Angenommen, wir möchten eine Webanwendung entwickeln.

Zunächst müssen wir festlegen, welche Frameworks wir verwenden möchten, welche Versionen verwendet werden sollen und wie sie miteinander verbunden werden sollen.

Alle Webanwendungen haben ähnliche Anforderungen. Die folgenden Abhängigkeiten werden in Spring MVC verwendet. Dazu gehören Spring MVC, Jackson Databind, Hibernate-Validator und 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> 

Wenn Sie eine Webanwendung oder eine Anwendung für RESTful-Dienste entwickeln möchten, wählen Sie Spring Boot Start Web. Lassen Sie uns mit dem Spring Boot Starter Web und dem Spring Initializr schnell ein Projekt erstellen.

Abhängigkeiten für Spring Boot Starter Web


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

Der folgende Screenshot zeigt die verschiedenen Abhängigkeiten, die unserer Anwendung hinzugefügt wurden.

Bild

Abhängigkeiten können klassifiziert werden in:

  • Frühling: Kern, Bohnen, Kontext, aop
  • Web MVC: (Spring MVC)
  • Jackson: für die JSON-Kommunikation
  • Validierung: Hibernate Validator, Validierungs-API
  • Eingebetteter Servlet-Container: Tomcat
  • Protokollierung: Rückmeldung, slf4j

Jede typische Webanwendung verwendet all diese Abhängigkeiten. Sie werden mit Spring Boot Starter Web geliefert. Als Entwickler muss ich mich nicht um diese Abhängigkeiten oder kompatiblen Versionen kümmern.

Projektoptionen für Spring Boot Starter


Wie wir aus dem Spring Boot Starter-Web ersehen können, helfen uns Startprojekte, bestimmte Arten von Anwendungen schnell zu entwickeln.

  • Spring-Boot-Starter-Webservices: SOAP-Webservices
  • spring-boot-starter-web: Web- und RESTful-Anwendungen
  • Spring-Boot-Starter-Test: Unit-Test und Integrationstest
  • spring-boot-starter-jdbc: Traditionelles JDBC
  • spring-boot-starter-hateoas: Fügen Sie HATEOAS-Funktionen zu Ihren Diensten hinzu
  • spring-boot-starter-security: Authentifizierung und Autorisierung mit Spring Security
  • spring-boot-starter-data-jpa: Spring-Data-JPA mit Ruhezustand
  • spring-boot-starter-cache: Aktivieren der Caching-Unterstützung von Spring Framework
  • spring-boot-starter-data-rest: Bereitstellung einfacher REST-Services mit Spring Data REST

Weitere Ziele von Spring Boot


Es gibt auch verschiedene Starter für technische Dinge:

  • Spring-Boot-Starter-Aktuator: Zur sofortigen Überwachung und Nachverfolgung Ihrer Anwendung
  • spring-boot-starter-undertow, spring-boot-starter-jetty, spring-boot-starter-tomcat: Zum Auswählen eines bestimmten eingebauten Servlet-Containers
  • spring-boot-starter-logging: Für die Protokollierung mit Logback
  • spring-boot-starter-log4j2: Protokollierung mit Log4j2

Spring Boot zielt darauf ab, Anwendungen für kürzere Zeiträume zu erstellen.

  • Aktor: Ermöglicht die erweiterte Überwachung und Nachverfolgung von Anwendungen.
  • Integrierte Server: Da der Server in die Anwendung integriert ist, muss auf dem Server ein separater Anwendungsserver installiert sein
  • Standardfehlerbehandlung

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


All Articles