Q1:spring-boot中Controller路径无法被访问的问题

在学习spring-boot入门的第一个例子就是spring-boot-web的一个在页面上输出hello-world的例子,在运行这个例子的时候我遇到了下面这个简单的问题,但是第一次解决还是花了我很长的时间,记录一下。

问题描述如下图:

我有三个Controller,一个是将主类当成第一个Controller;第二个Controller在主类所在的子目录下,就是TestController;第三个Controller是捕鱼主类在同一个包下的OutOfRangeController。而主类的配置只有一个@SpringBootApplication。但是在浏览器进行访问的时候却出现了第一第二个Controller可以访问的到,而第三个OutOfRangeController访问不到的问题,如下图所示:

而出现这种情况的原因在于@SpringBootApplication。下图是官方给出的注解使用说明:

 这一大段大概就是指明了一个意思@SpringBootApplication=@EnableAutoConfiguration+@ComponentScan+@Configuration

@Configuration:该注解将类可以看成配置文件,通常和@Bean配合使用

@EnableAutoConfiguration:在程序启动时自动加载配置

@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。

我们需要关注的就是@ComponentScan,下面是官方给出的一段对于@ComponentScan的介绍

大概意思是说,如果代码结构按照被建议的那样,将主类放在根目录下,那么只需要配置一个@ComponentScan,无需添加任何参数。而这一句就解释了我们自己编写的第一个和第二个Controller为什么会被加载,而第三个OutOfRangeController无法被加载,因为第三个OutOfRangeController和主类不再同一个目录下,无法被自动加载,所以需要我们去手动加载。于是我在主类上手动添加了一条@ComponentScan,将第三个OutOfRangeController所在的路径进行添加,如下图所示

启动工程发现虽然第三个OutOfRangeController可以访问了,但是TestController无法正常访问

 说明自己配置的@ComponentScan覆盖了@SpringBootApplication中的@ComponentScan,但是由于@SpringBootApplication还有另外两个标签,所以在主类中配置的Controller还是好使的,但是在其子包下的配置都不好使了,无法被自动搜索到。

所以在配置@ComponentScan时,推荐以下两种配置,第一种是将根路径作为参数,第二种是多配置几个路径,如下图所示

以上不仅是对Controller配置有效,推广来看应该是对@Component所有子注解都有效。

猜你喜欢

转载自www.cnblogs.com/remember-me/p/10091126.html
Q1
今日推荐