Почему @ComponentScan требуется при добавлении @SpringBootApplication? - PullRequest
1 голос
/ 21 февраля 2020

Я новичок в SprinBoot и написал простое приложение с классом контроллера. Но когда я пытался запустить этот контроллер из браузера, он выдавал ошибку HTTP-404. Он начал работать только после добавления аннотации @ComponentScan для загрузки этого контроллера.

Мой вопрос, хотя я использую @SpringBootApplication, зачем мне добавлять аннотацию @ComponentScan? Разве это не должно делать то же самое?

POM. xml

<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.test.springboottest</groupId>
    <artifactId>springboot-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBoot Test App</name>
    <description>SpringBoot Test App</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
    </parent>


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

    <properties>
        <java.version>1.8</java.version>
    </properties>
</project>

Контроллер:

package com.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

    @RestController
    @RequestMapping("/test")
    public class MyController {

    @RequestMapping("/sayHello")
    public String testRequest() {
        return "hello";  
    }
    }

Основной метод:

package com.test.springboottest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;
    @SpringBootApplication
    @ComponentScan("com.test.controller")
    public class TestSpringBootApp {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ApplicationContext ctx = SpringApplication.run(TestSpringBootApp.class, args);
            String[] defnName = ctx.getBeanDefinitionNames();
            int i =0;
            while(i<defnName.length) {
                System.out.println(defnName[i]);
                ++i;
            }

        }

    }

1 Ответ

7 голосов
/ 21 февраля 2020

Аннотация @ComponentScan не требуется, если TestSpringBootApp находится в пакете root вашего приложения, которое в данном случае выглядит как com.test.

Подробнее см. Документацию Spring Boot :

Как правило, мы рекомендуем размещать ваш основной класс приложения в пакете root над другими классами. Аннотация @SpringBootApplication часто помещается в ваш основной класс и неявно определяет базовый «пакет поиска» для определенных элементов.

В документации также приведен пример:

В следующем листинге показана типичная раскладка:

com
 +- example
     +- myapplication
         +- Application.java
         |
         +- customer
         |   +- Customer.java
         |   +- CustomerController.java
         |   +- CustomerService.java
         |   +- CustomerRepository.java
         |
         +- order
             +- Order.java
             +- OrderController.java
             +- OrderService.java
             +- OrderRepository.java
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...