Почему приложение Spring-Boot не требует @EnableWebMvc

Итак, я написал небольшое приложение, Чтобы познакомиться с основами, я сделал это как можно проще. Я сделал простое приложение mvc с файлом Config.java, и когда я подумал, что теперь приложение должно выдавать ошибку, оно действительно работает.

Вот мой pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency> 
        <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

Мой файл конфигурации, в котором есть только преобразователь представлений:

package com.example.demo;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;

import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;


@Configuration
public class DemoConfig {

    @Bean
    public ViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setViewClass(JstlView.class);
        bean.setPrefix("/templates/");
        bean.setSuffix(".html");
        return bean;
    }
}

Главный файл

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

И, наконец, класс контроллера: пакет com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class TestController {
    @GetMapping(value = "home")
    public String home() {
        return "home";
    }
}

Application.properties

server.servlet.context-path=/demo

Итак, это все приложение, насколько я помню, мне требуется mvc:annotation- driven в web.xml или @enablewebmvc для работы @getmapping и @controller, но мое приложение работает полностью. Как не выдает ошибку?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
18
0
13 678
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку вы используете загрузочное приложение, @SpringBootApplication эта аннотация по умолчанию включает приложение, управляемое аннотациями (mvc: управляемое аннотациями). Конфигурацию предоставлять не нужно. Прочтите о @SpringBootApplication https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html.

"Вам не нужно предоставлять конфигурацию" означает также отсутствие файла конфигурации?

Gagan Singh 24.06.2018 11:13

означает, что он обеспечивает базовую конфигурацию по умолчанию в соответствии с jar в пути к классу и другим способом. Не вся сложная конфигурация

Ashwani Tiwari 24.06.2018 11:17

Полученное вами поведение: "все работает" ожидается с Spring Boot.
. Spring Boot - это не Spring: он идет дальше Spring.
Действительно, Spring Boot максимально сокращает требуемую конфигурацию, чтобы ваше приложение могло работать. Хорошим примером является аннотация @SpringBootApplication, которая была введена для того, чтобы ваше приложение работало на Spring. Кроме того, Spring Boot предлагает некоторые стартеры для пакетных зависимостей, а также конфигурации Spring.

В вашем случае, поскольку вы объявили spring-boot-starter-web как зависимость, установлена ​​конфигурация Spring MVC и другие вещи, связанные с веб-приложениями с помощью Spring. документация действительно утверждает:

11.3.2 The @EnableAutoConfiguration Annotation

Since spring-boot-starter-web added Tomcat and Spring MVC, the auto-configuration assumes that you are developing a web application and sets up Spring accordingly.

Ответ принят как подходящий

@SpringBootApplication - это удобная аннотация, которая добавляет все следующее:

  • @Configuration помечает класс как источник определений bean-компонентов для контекст приложения.
  • @EnableAutoConfiguration сообщает Spring Boot начать добавление beans на основе настроек пути к классам, других bean-компонентов и различных свойств настройки.
  • Обычно вы добавляете @EnableWebMvc для приложения Spring MVC, но Spring Boot добавляет его автоматически, когда видит spring-webmvc на путь к классам. Это помечает приложение как веб-приложение и активирует ключевые действия, такие как настройка DispatcherServlet.
  • @ComponentScan сообщает Spring искать другие компоненты, конфигурации и службы в пакете hello, что позволяет ему найти контроллеры.

Важно помнить об этом третьем пункте. Не аннотируйте классы @Configuration с помощью @EnableWebMvc. В противном случае Spring MVC загрузится и будет использовать свою собственную конфигурацию сериализации / десериализации, игнорируя вашу конфигурацию Spring Boot.

Jack Straw 22.03.2019 00:19

Если вы не используете аннотацию @EnableWebMvc, вы можете сначала не заметить никакой разницы, но такие вещи, как content-type и accept header, обычно согласование содержимого не работают.

Bhargav Patel 26.06.2019 06:09

~ 5 часов, чтобы понять, что также, если веб-приложение работало, у меня не было spring-autoconfigure-web в pom.xml, поэтому нет @EnableWebMvc, и поэтому просто MultipartFile не работал со всеми материалами, связанными с Интернетом, спасибо автонастройке чтобы реализовать эту простую настройку и рабочий процесс трудной отладки.

rascio 29.03.2021 17:55

Другие вопросы по теме