【SpringBoot学习】01_1. @EnableAutoConfiguration 和 @ComponentScan

代码地址 https://gitee.com/better-code/SpringBoot-Example/springboot01_1/
代码结构

image.png

com.example.springboot01_1.web.HelloController

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        String name = "SpringBoot";
        return "Hello "+name+" !";
    }
}

com.example.springboot01_1.App

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

Run App.java
访问 http://localhost:8080/hello,页面报错 Whitelabel Error Page

原因:没有将 HelloController 添加到spring容器中


修改 App.java 如下

@EnableAutoConfiguration
@ComponentScan
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

Run App.java
访问 http://localhost:8080/hello,页面打印 Hello SpringBoot !


修改 App.java 如下

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

Run App.java 时,提示错误

ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

总结:

通常建议将应用的main类放到其他类所在包的顶层(root package),并将 @EnableAutoConfiguration 注解到你的main类上,这样就隐式地定义了一个基础的包搜索路径(search package),以搜索某些特定的注解实体(比如@Service,@Component等) 。

例如,如果你正在编写一个JPA应用,Spring将搜索 @EnableAutoConfiguration 注解的类所在包下的 @Entity 实体。采用root package方式,你就可以使用 @ComponentScan 注解而不需要指定 basePackage 属性,也可以使用 @SpringBootApplication 注解,只要将main类放到root package中

@EnableAutoConfiguration 注解只会自动搜索当前类所在包下的注解实体,而@ComponentScan 会自动搜索 当前类所在包的所有子包下的注解实体。

@ComponentScan + @EnableAutoConfiguration = @SpringBootApplication

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容