Упрощенный путь от Spring MVC к Spring Boot

Spring Boot задняя часть Spring MVC

задний план

От технологии сервлетов до Spring и Spring MVC разработка веб-приложений стала проще и проще. Тем не менее, многие конфигурации Spring и Spring MVC иногда непосильны, и я верю, что друзья, имеющие опыт разработки Spring MVC, могут глубоко оценить эту боль. Потому что даже для разработки веб-приложения Hello-World нам нужно импортировать различные зависимости в файл pom, писать файлы конфигурации web.xml, spring.xml, springmvc.xml и т.д. Особенно, когда нам нужно импортировать большое количество зависимостей пакетов jar, нам нужно искать различные ресурсы пакетов jar в Интернете.Между каждым jar могут быть различные зависимости.В это время мы должны загрузить пакеты jar, от которых они зависят , Иногда все еще существуют пакеты jar.Существуют строгие требования к версии, поэтому, когда мы просто хотим разработать супер простое веб-приложение Hello-World, мы тратим большую часть времени на написание файлов конфигурации и импорт зависимостей пакетов jar, которые сильно влияет на эффективность нашего развития. Итак, чтобы упростить сложную настройку Spring, появился Spring Boot. Как следует из названия Spring Boot, запуск одним щелчком мыши, Spring Boot предоставляет функции автоматической настройки, предоставляя нам готовые функции, что позволяет нам сосредоточиться на разработке бизнес-логики. Так как же Spring Boot упрощает Spring MVC? Какова связь между Spring Boot и Spring и Spring MVC? Каковы новые функции Spring Boot? Далее давайте пройдемся по упрощенной дороге от Spring MVC к Spring Boot, возможно, вы сможете найти эти ответы.

Spring vs Spring MVC vs Spring Boot

  • Spring Boot не конкурирует с Spring и Spring MVC, Spring Boot упрощает нам использование Spring и Spring MVC.

Spring FrameWork

  • Какова основная проблема, которую решает Spring FrameworkWork Наиболее важной функцией Spring Framework является внедрение зависимостей, ядром всех модулей Spring является внедрение зависимостей (DI) или инверсия управления (IOC). Почему это важно, потому что, когда мы используем DI или IOC, мы можем отделить приложение. Давайте рассмотрим простой пример:

Пример без внедрения зависимостей:

@RestController
public class WelcomeController {

    private WelcomeService service = new WelcomeService();

	@RequestMapping("/welcome")
	public String welcome() {
		return service.retrieveWelcomeMessage();
	}
}

WelcomeService service = new WelcomeService(); 意味着WelcomeController类与WelcomeService类紧密结合在一起,耦合度高。

Пример использования внедрения зависимостей:

@Component
public class WelcomeService {
    //Bla Bla Bla
}

@RestController
public class WelcomeController {

    @Autowired
    private WelcomeService service;

	@RequestMapping("/welcome")
	public String welcome() {
		return service.retrieveWelcomeMessage();
	}
}

依赖注入使世界看起来更简单,我们让Spring 框架做了辛勤的工作:
@Component:我们告诉Spring框架-嘿,这是一个你需要管理的bean
@Autowired:我们告诉Spring框架-嘿,找到这个特定类型的正确匹配并自动装入它

Что еще может решить Spring

1. Дублирующийся код
Остановил ли Spring Framework внедрение зависимостей (DI)? Нет, он разрабатывает множество модулей Spring на основе основной концепции внедрения зависимостей (DI):

  • Spring JDBC
  • Spring MVC
  • Spring AOP
  • Spring ORM
  • Spring Test
  • ...
    Рассмотрите Spring JDBC, привносят ли эти модули новую функциональность? Нет, мы можем использовать код Java для выполнения этих задач. Так что же они нам приносят? Они создают простые абстракции, целью которых является:
  1. Уменьшить шаблонный код/уменьшить дублирование
  2. Облегчает развязку / повышает возможность модульного тестирования Например: по сравнению с традиционным JDBC нам нужно написать намного меньше кода, используя Spring JDBC.

2. Хорошая интеграция с другими фреймворками
Фреймворк Spring не пытается решить проблему, которая уже решена, все, что он делает, это обеспечивает идеальную интеграцию с фреймворком, который предлагает отличное решение.

  • Hibernate
  • IBatis
  • JUnit
  • ...

Spring MVC

  • Какова основная проблема, которую решает среда Spring MVC? Фреймворк Spring MVC предоставляет отдельный способ разработки веб-приложений. Благодаря простым концепциям, таким как DispatcherServlet, ModelAndView, View Resolver и т. д., разработка веб-приложений становится проще.

Зачем вам нужен Spring Boot

Приложения на основе Spring имеют множество конфигураций. Когда мы используем Spring MVC, нам нужно настроить сканирование компонентов, сервлет планировщика, преобразователь представления и т. д.:

视图解析器配置:
  <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/"/>
  
  前端调度器的典型配置:
  <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>
    
当我们使用Hibernate / JPA时,我们需要配置一个数据源,一个实体管理器工厂,一个事务管理器以及许多其他事物:
    <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"/>

Проблемы, которые решает Spring Boot

1. Автоматическая настройка Spring Boot
Spring представляет новый мыслительный процесс: можем ли мы стать умнее? Можем ли мы автоматически настроить некоторые bean-компоненты, когда в приложение добавляется spring mvc jar?

  1. Как насчет автоматической настройки источника данных, когда JAR-файл Hibernate находится в пути к классам?
  2. Как насчет автоматической настройки сервлета Dispatcher, когда jar-файлы Spring MVC находятся в пути к классам?
  • Spring Boot просматривает фреймворки в CLASSPATH, которым необходимо написать конфигурацию для этого приложения.На их основе Spring Boot предоставляет базовую конфигурацию этих фреймворков — это автоматическая конфигурация.

2. Spring Boot Starter Projects
Предположим, мы хотим разработать веб-приложение. Во-первых, нам нужно решить, какой фреймворк мы хотим использовать, какую версию фреймворка использовать и как связать их вместе. Все веб-приложения имеют схожие потребности. Ниже перечислены некоторые зависимости, которые мы используем в Spring MVC. К ним относятся Spring MVC, Jackson Databind (для привязки данных), Hibernate-Validator (для проверки на стороне сервера с использованием Java Validation API) и 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>
    
  • Что такое стартер
Starter是一套方便的依赖描述符,可以包含在应用程序中。
你可以获得所需的所有Spring及相关技术的一站式服务,而无需搜索示例代码并复制依赖描述符的粘贴负载。
例如,如果你想开始使用Spring和JPA来访问数据库,只需在你的项目中包含spring-boot-starter-data-jpa依赖项就好。

Давайте рассмотрим пример Starter — Spring-Boot-Starter-Web.

Spring-Boot-Starter-Web依赖:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

На следующих снимках экрана показаны различные зависимости, добавленные в наше приложение:

Любое типичное веб-приложение будет использовать все эти зависимости, Spring Boot Starter Web уже поставляется с ними. Нам как разработчикам не нужно беспокоиться об этих зависимостях или совместимых версиях.

3. Варианты проекта Boot Boot стартера
Как и Spring Boot Starter Web, проект Starter помогает нам быстро приступить к разработке определенных типов приложений:

  • spring-boot-starter-web-services — веб-службы SOAP
  • spring-boot-starter-web — веб-приложения и приложения RESTful
  • spring-boot-starter-test — Модульные и интеграционные тесты
  • spring-boot-starter-data-jpa — Spring Data JPA с Hibernate
  • spring-boot-starter-cache — включить поддержку кэширования Spring Framework.
  • ...

Что такое автоконфигурация Spring Boot

Он был представлен изначально и будет подробно представлен здесь.
Когда мы запускаем приложение Spring Boot, мы видим в журналах несколько важных сообщений.

Mapping servlet: 'dispatcherServlet' to [/]

Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)

Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]

Приведенный выше оператор журнала показывает поведение Spring Boot Auto Configuration.
Как только мы добавим веб-зависимость Spring Boot Starter в наше приложение, автоконфигурация Spring Boot обнаружит, что Spring MVC находится в пути к классам, и автоматически настроит dispatcherServlet, страницу ошибок по умолчанию и webjars.
Если вы добавите зависимость Spring Boot DataJPA Starter, Spring Boot AutoConfiguration автоматически настроит источник данных и Entity Manager.

Где реализована автоматическая настройка Spring Boot

Вся логика автоконфигурации реализована в spring-boot-autoconfigure.jar. Вся логика автоматической настройки для mvc, данных и других фреймворков находится в одном jar-файле.

Важным файлом в spring-boot-autoconfigure.jar является /META-INF/spring.factories, в этом файле перечислены все классы автоконфигурации, запущенные с помощью ключа EnableAutoConfiguration. Некоторые важные классы конфигурации перечислены ниже:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\

Просмотр автоматической конфигурации

Включить ведение журнала отладки
Включите ведение журнала отладки в application.properties:

logging.level.org.springframework: DEBUG

При запуске программы распечатывается информация журнала автоконфигурации.

Суммировать

Появление Spring Boot само по себе должно снизить порог веб-разработки, чтобы разработчики могли сосредоточиться на развитии бизнеса, не тратя время на сторонние разработки.Пока что упрощенный путь от Spring MVC к Spring Boot окончен.