Spring Boot стал обязательным навыком для прохождения собеседований.Еще не поздно изучить Spring Boot!

Spring Boot Java

предисловие

С момента выпуска в 2014 году поисковый индекс Spring Boot резко вырос. Верно, Spring Boot становится все более и более популярным.Как передовой Java-программист, вы можете почувствовать огонь Spring Boot во всех аспектах.

Теперь в основных технических сообществах появляется все больше и больше статей о Spring Boot, появляется все больше и больше графических и видеоруководств, связанных с Spring Boot, и все больше и больше интернет-компаний используют Spring Boot; Java-программисты теперь ходят на собеседования, и Spring Boot стал надо спросить.

Все доказывает, что Spring Boot стал обязательным навыком для Java-программистов. И можно предвидеть, что развитие Spring Boot будет лучше в будущем. Еще не поздно изучить Spring Boot!

Учебное пособие по Spring Boot2

В проектах Spring Boot обычно нет конфигурации XML, потому что Spring Boot не рекомендует использовать XML. Обратите внимание, что он не является неподдерживаемым. Spring Boot рекомендует разработчикам использовать конфигурацию Java для построения фреймворка. В Spring Boot много Конфигурация автоматизации достигается за счет конфигурации Java.Также мы можем сделать этот набор реализаций сами, то есть мы можем использовать и чистую Java для построения среды SSM, то есть в проекте отсутствует конфигурация XML, в том числе веб. xml. .

Требования к окружающей среде:

Чтобы использовать чистую Java для создания среды SSM, версия Tomcat должна быть выше 7.

1. Создайте проект

Создайте обычный проект Maven (обратите внимание, что здесь не обязательно создавать веб-проект), и добавьте зависимости SpringMVC, в то же время построение среды здесь требует использования сервлетов, поэтому нам также необходимо ввести Зависимости сервлетов (не должны использовать более ранние версии сервлетов)), окончательный файл pom.xml выглядит следующим образом:
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.1.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>

2. Добавьте конфигурацию Spring

После успешного создания проекта сначала добавьте файл конфигурации Spring следующим образом:
@Configuration
@ComponentScan(basePackages = "org.javaboy", useDefaultFilters = true,
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes =
Controller.class)})
public class SpringConfig {
}
Относительно этой конфигурации скажу следующее:
В аннотации @Configuration указано, что это класс конфигурации, в нашем случае эта конфигурация аналогична applicationContext.xml
Аннотация @ComponentScan указывает на сканирование пакета конфигурации, свойства в нем и свойства в конфигурации xml находятся во взаимно однозначном соответствии, useDefaultFilters указывает на использование фильтра по умолчанию, а затем убирает аннотацию Controller, то есть сканирует другие чем контроллер в контейнере Spring All beans.

3. Добавьте конфигурацию SpringMVC

Затем создайте файл конфигурации springmvc:
@Configuration
@ComponentScan(basePackages = "org.javaboy",useDefaultFilters =
false,includeFilters = {@ComponentScan.Filter(type =
FilterType.ANNOTATION,classes = Controller.class)})
public class SpringMVCConfig {
}
Обратите внимание, что если вам не нужно добавлять другую дополнительную конфигурацию в SpringMVC, это нормально. То есть парсер просмотра, парсинг JSON, закачка файлов и т.д. Если не нужно настраивать, то можно.

4. Настройте web.xml

На данный момент у нас нет файла web.xml. В настоящее время мы можем использовать код Java для замены файла web.xml. Здесь будет использоваться WebApplicationInitializer, который определяется следующим образом:
public class WebInit implements WebApplicationInitializer {
  public void onStartup(ServletContext servletContext) throws ServletException
{
    //首先来加载 SpringMVC 的配置文件
    AnnotationConfigWebApplicationContext ctx = new
AnnotationConfigWebApplicationContext();
    ctx.register(SpringMVCConfig.class);
    // 添加 DispatcherServlet
    ServletRegistration.Dynamic springmvc =
servletContext.addServlet("springmvc", new DispatcherServlet(ctx));
    // 给 DispatcherServlet 添加路径映射
    springmvc.addMapping("/");
    // 给 DispatcherServlet 添加启动时机
    springmvc.setLoadOnStartup(1);
 }
}
Роль WebInit аналогична web.xml.Этот класс должен реализовать интерфейс WebApplicationInitializer и реализовать методы в интерфейсе.При запуске проекта будет автоматически выполняться метод onStartup.В этом методе мы можем выполнять некоторые операции инициализации проекта , такие как загрузка контейнера SpringMVC, добавление фильтра, добавление прослушивателя, добавление сервлета и т. д.
Уведомление:
Поскольку мы только добавили конфигурацию SpringMVC в WebInit, проект будет загружать только контейнер SpringMVC при запуске, но не контейнер Spring.Если контейнер Spring должен быть загружен, нам нужно изменить конфигурацию SpringMVC, настроенную в SpringMVC. сканирование пакета, также сканируется аннотация @Configuration, а затем загружается контейнер Spring.Есть еще одно решение этой проблемы, которое заключается в том, чтобы напрямую отказаться от конфигурации Spring в проекте, и напрямую поместить всю конфигурацию в конфигурацию SpringMVC для завершения, которая интегрирована в SSM В реальной разработке в основном используется вторая схема Вторая схема, конфигурация SpringMVC выглядит следующим образом:
@Configuration
@ComponentScan(basePackages = "org.javaboy")
public class SpringMVCConfig {
}
В этой схеме все аннотации сканируются в SpringMVC.Если эта схема принята, файл конфигурации Spring можно удалить.

5. Тест

Наконец, добавьте HelloController и запустите проект для тестирования:
@RestController
public class HelloController {
  @GetMapping("/hello")
  public String hello() {
    return "hello";
 }
}
Запустите проект, войдите в интерфейс, и результаты будут следующими:

Глобальная обработка исключений Spring Boot

В проекте Spring Boot исключения обрабатываются единообразно.Вы можете использовать @ControllerAdvice в Spring для их унифицированной обработки или определить схему обработки исключений самостоятельно. В Spring Boot есть несколько стратегий обработки исключений по умолчанию, давайте рассмотрим их отдельно.
По умолчанию страница исключений в Spring Boot выглядит так:
Из этого запроса об исключении мы также можем видеть, что причина, по которой пользователь видит эту страницу, заключается в том, что разработчик явно не указал путь / error.Если разработчик укажет путь / error, эта страница не будет отображаться, но в Spring Boot, предоставляя путь /error на самом деле в крайнем случае.Когда Spring Boot сам обрабатывает исключения, он найдет путь /error только в том случае, если не соблюдены все условия. Итак, давайте сначала посмотрим, как настроить страницу ошибки в Spring Boot, в целом ее можно разделить на два типа: одна — статическая страница, другая — динамическая страница.

Статическая страница исключения

Существует два типа настраиваемых статических страниц исключений: первый — использовать код ответа HTTP для именования страницы, например 404.html, 405.html, 500.html.... Другой — напрямую определить 4xx. html, указывающий, что статус 400-499 отображает эту ненормальную страницу, а 5xx.html указывает, что статус 500-599 отображает эту ненормальную страницу.
По умолчанию соответствующие страницы определяются в classpath:/static/error/:
На этом этапе запустите проект, если проект выдает ошибку запроса 500, страница 500.html будет отображаться автоматически, а страница 404.html будет отображаться при возникновении ошибки 404. Если страница аномального отображения имеет как 5xx.html, так и 500.html , в это время, когда возникает исключение 500, страница 500.html будет отображаться первой.

Страница динамического исключения

Динамическая страница исключений определяется так же, как и статическая.В число шаблонов страниц, которые можно использовать, входят jsp, freemarker и тимелеаф.
Страница динамического исключения также поддерживает 404.html или 4xx.html, но в целом, поскольку страница динамического исключения может напрямую отображать сведения об исключении, нет необходимости перечислять ошибки одну за другой и напрямую определять 4xx.html (файл здесь используется шаблон тимелеафа) или 5xx.html.
Обратите внимание, что шаблон динамической страницы не требует, чтобы разработчик сам определял контроллер, но может напрямую определить страницу исключения.Обработчик исключений, который поставляется с Spring Boot, автоматически найдет страницу исключения.
Страница определяется следующим образом:
Содержание страницы следующее:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<h1>5xx</h1>
<table border="1">
  <tr>
    <td>path</td>
    <td th:text="${path}"></td>
  </tr>
  <tr>
    <td>error</td>
    <td th:text="${error}"></td>
  </tr>
  <tr>
    <td>message</td>
    <td th:text="${message}"></td>
  </tr>
  <tr>
    <td>timestamp</td>
    <td th:text="${timestamp}"></td>
  </tr>
  <tr>
    <td>status</td>
    <td th:text="${status}"></td>
  </tr>
</table>
</body>
</html>
По умолчанию полная информация об исключении — это эти 5 штук, а эффект отображения следующий:
Если и динамические, и статические страницы определяют страницы обработки исключений, например, если classpath:/static/error/404.html и classpath:/templates/error/404.html существуют одновременно, динамические страницы используются по умолчанию. То есть полный метод поиска страницы ошибок должен быть таким:

Произошла ошибка 500 --> найти динамическую страницу 500.html --> найти статическую страницу 500.html --> найти динамическую 5xx.html --> найти статическую 5xx.html.

Пользовательские данные исключения

По умолчанию в Spring Boot все аномальные данные на самом деле представляют собой 5 фрагментов данных, показанных выше.Эти 5 фрагментов данных определены в классе org.springframework.boot.web.reactive.error.DefaultErrorAttributes, который специально определен в In метод getErrorAttributes:
@Override
public Map<String, Object> getErrorAttributes(ServerRequest request,
        boolean includeStackTrace) {
    Map<String, Object> errorAttributes = new LinkedHashMap<>();
    errorAttributes.put("timestamp", new Date());
    errorAttributes.put("path", request.path());
    Throwable error = getError(request);
    HttpStatus errorStatus = determineHttpStatus(error);
    errorAttributes.put("status", errorStatus.value());
    errorAttributes.put("error", errorStatus.getReasonPhrase());
    errorAttributes.put("message", determineMessage(error));
    handleException(errorAttributes, determineException(error),
includeStackTrace);
    return errorAttributes;
}
Сам класс DefaultErrorAttributes находится в
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration определен в классе автоматической настройки исключений.Если разработчик не предоставляет экземпляр ErrorAttributes, Spring Boot автоматически предоставит экземпляр ErrorAttributes, которым является DefaultErrorAttributes .
Исходя из этого, разработчики могут настраивать ErrorAttributes двумя способами:

1. Напрямую реализовать интерфейс ErrorAttributes

2. Наследовать DefaultErrorAttributes (рекомендуется), поскольку обработка аномальных данных в DefaultErrorAttributes завершена, и разработчики могут использовать ее напрямую.

Конкретные определения следующие:

@Component
public class MyErrorAttributes  extends DefaultErrorAttributes {
  @Override
  public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean
includeStackTrace) {
    Map<String, Object> map = super.getErrorAttributes(webRequest,
includeStackTrace);
    if ((Integer)map.get("status") == 500) {
      map.put("message", "服务器内部错误!");
   }
    return map;
 }
}
Определенные ErrorAttributes должны быть зарегистрированы как Bean, чтобы Spring Boot не использовал DefaultErrorAttributes по умолчанию, эффект операции следующий:

Пользовательское представление исключений

Представление исключений по умолчанию — это статическая или динамическая страница, упомянутая выше, которую также можно настроить.Во-первых, логика загрузки представления исключений по умолчанию находится в методе errorHtml класса org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController. , Этот метод используется для возврата ненормальной страницы + данных, и есть еще один метод ошибки, этот метод используется для возврата ненормальных данных (если это запрос ajax, этот метод будет активирован).
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request,
        HttpServletResponse response) {
    HttpStatus status = getStatus(request);
    Map<String, Object> model =
Collections.unmodifiableMap(getErrorAttributes(
            request, isIncludeStackTrace(request,
MediaType.TEXT_HTML)));
    response.setStatus(status.value());
    ModelAndView modelAndView = resolveErrorView(request, response, status,
model);
    return (modelAndView != null) ? modelAndView : new ModelAndView("error",
model);
}
В этом методе данные об исключении будут получены через метод getErrorAttributes (на самом деле будет вызываться метод getErrorAttributes экземпляра ErrorAttributes), а затем будет вызываться resolveErrorView для создания ModelAndView. см. страницу советов по ошибкам по умолчанию.
Обычно метод resolveErrorView приходит к методу resolveErrorView класса DefaultErrorViewResolver:
@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus
status,
        Map<String, Object> model) {
    ModelAndView modelAndView = resolve(String.valueOf(status.value()),
model);
    if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
        modelAndView = resolve(SERIES_VIEWS.get(status.series()),
model);
   }
    return modelAndView;
}
Здесь сначала используйте код ответа исключения в качестве имени представления, чтобы найти динамическую страницу и статическую страницу соответственно, если не найдено, затем используйте 4xx или 5xx в качестве имени представления для поиска динамической или статической страницы соответственно.
Также легко настроить разрешение представления исключений, поскольку DefaultErrorViewResolver — это экземпляр, предоставляемый в классе ErrorMvcAutoConfiguration, то есть, когда разработчик не предоставляет соответствующий экземпляр, будет использоваться DefaultErrorViewResolver по умолчанию.После того, как разработчик предоставит свой собственный экземпляр ErrorViewResolver, конфигурация по умолчанию будет недействительной, поэтому для настройки представления исключений вам нужно только предоставить экземпляр ErrorViewResolver:
@Component
public class MyErrorViewResolver extends DefaultErrorViewResolver {
  public MyErrorViewResolver(ApplicationContext applicationContext,
ResourceProperties resourceProperties) {
    super(applicationContext, resourceProperties);
 }
  @Override
  public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus
status, Map<String, Object> model) {
    return new ModelAndView("/aaa/123", model);
 }
}
На самом деле разработчики также могут определить здесь данные об исключении (переопределить модель прямо в методе resolveErrorView, скопировать и изменить данные модели в параметре, обратите внимание, что тип модели в параметре — UnmodifyingMap, то есть его нельзя изменить напрямую) , и нет необходимости настраивать MyErrorAttributes. После завершения определения предоставьте представление с именем 123, как показано ниже:
После этого попытка ошибки определяется как успешная.

Суммировать

На самом деле можно настроить еще и контроллер исключений BasicErrorController , но я думаю, что с этим бороться слишком много, да и не нужно.Предыдущие методы уже могут удовлетворить большую часть наших потребностей в разработке. Если это архитектура с разделением интерфейса и сервера, существуют другие решения для обработки исключений, которые мы обсудим позже.
Пространство ограничено, и другое содержимое здесь не показано.Это практическое руководство по Spring Boot организовано в виде документа PDF с общим объемом более 200 страниц.

Обратите внимание на официальный аккаунт: Программисты следуют за ветром, ответьте 005, чтобы получить это практическое руководство по Spring Boot.

Наконец

Приветствую всех, чтобы общаться вместе. Если вам понравилась статья, не забудьте подписаться на меня и поставить лайк. Спасибо за вашу поддержку!