SpringBoot 入坑第一个问题:为什么springboot启动类不能放在Java资源目录下

写在前面:这个问题并不是我最初遇到的问题,是自己误打误撞遇到的

springboot入门案例

最初的问题:访问controller出现404

  1. 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.liuzeyu12a</groupId>
    <artifactId>spring01_quick</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>

    <dependencies>
        <!--web过程的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
  1. controller
@Controller
public class QuickController { 

    @RequestMapping("/quick")
    @ResponseBody
    public String quick(){ 
        return "hello springboot";
    }
}

经查阅资料发现,这是由于springBoot默认包扫描机制没有扫描到controlle里面的的这个类,因此返回的时候没有找到路径爆出404。

springBoot默认包扫描机制:默认扫描启动类所在的包同级文件和子包下的文件,因此放在start下是无法扫描到controller下的。

解决方案
将启动类放在liuzeyu包下即可。

或者可以自己指定springboot启动默认要扫描的包,使用注解

@ComponentScan(basePackages = "com.liuzeyu.controller.")

<mark>注意</mark>
启动类是不能写在Java目录下的在,这是很多小伙伴不能理解的。

否则启动直接报错:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/C:/Users/liuze/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar!/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$EmbeddedDatabaseConfiguration.class]; nested exception is java.lang.IllegalStateException: Could not evaluate condition on org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$EmbeddedDatabaseConfiguration due to org/springframework/dao/DataAccessException not found. Make sure your own configuration does not rely on that class. This can also happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake)

为什么不能把启动类直接放到java的文件夹下应该要从@ComponentScan这个注解的作用说起, 这个注解的作用是告诉spring,哪里可以找到bean, 如果在启动类没有配置这个注解,则默认扫描机制将扫描<mark>启动类所在的包</mark>的同级目录和它的子包,也可以配置具体路径扫描。 基于这个作用所以不能把启动类放在Java文件下,首先Java文件不是一个包,其次它是一个资源文件。故只要一启动就会报错。

如有理解不到位,恳请指教。

页面下部广告