亲爱的友友们,为了方便理解,文章中附带了很多的代码和图片解释说明,文章有点长,要耐心解读,读完你一定会有所收获。
话不多说:上图(三分看图,七分看代码和分析,图先扫一眼即可,看完下边的再来看图)
目录
文章背景
SpringBoot是如何通过启动main方法就启动一个web项目呢
main方法代码如下
@SpringBootApplication//启动类注解 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
@SpringBootApplication解析
一切来源于SpringBoot有一个牛逼的注解:@SpringBootApplication SpringBoot启动类注解,首先我们看下main方法里面做了什么。
执行了run静态方法启动项目,有参数DemoApplication.class,这个类不可以随意改动,必须是被@SpringBootApplication修饰的类。
SpringApplication.run(DemoApplication.class, args);
当然会有人问改动了会怎么样呢,我们试下,就把启动类注解注释掉再次启动,会报错如下图一样,提示无法启动web服务器,可见@SpringBootApplication的强大之处。
@SpringBootApplication到底做了哪些事情,我们看下源码,进入@SpringBootApplication可以看到里面是一个组合注解,除去Java的元注解,下图中框住的三个是真正发挥作用的注解
三个核心注解分别解释
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
1.@SpringBootConfiguration
@SpringBootConfiguration:代表springboot配置类,进入@SpringBootConfiguration注解,里面也是一个组合注解,除去Java元注解,最重要的就是@Configuration,标明配置类
继续进入@Configuratio中,里面是一个容器的注解@Component,它的意思是加载到spring的管理体系中
总结:@SpringBootConfiguration===SpringBoot配置类--@Configuratio标明配置类--@Component加载到spring管理体系中
2.@EnableAutoConfiguration
@EnableAutoConfiguration:开启自动配置,重点来了,进入@EnableAutoConfiguration注解,除去Java元注解,两个重点注解@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})
先说第一个注解:@AutoConfigurationPackage--可以说是自动配置包,进入@AutoConfigurationPackage注解中,除去Java元注解,剩下重点注解@Import({Registrar.class}),它的意思是把Registrar.class文件加载到容器中
进入Registrar.class类,可以看到里面是一个非常复杂的类,找到重点方法BasePackages
启动项目,在BasePackages方法中第三行打断点,看看自动配置的什么包
执行结果如下图:所谓的自动装配就是启动类Application的上一级包下的所有子包,也就是我们写的代码,启动main方法的时候会把我们的代码扫描到spring容器中去。
但是假设我们写的代码不在启动类Application的上一级包中,也就是不在图中的demo包中,则无法加载到spring容器中,也就无法访问,测试代码如下,创建了一个com.test.study的包,包中新建了StudyController
package com.test.study; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/study") public class StudyController { @GetMapping(value = "/test") public String test(){ return "张三"; } }
启动项目:访问localhost:8080/study/test会出现提示404,找不到接口
总结:@AutoConfigurationPackage把启动类所在的包进行默认扫描,该包下所有的类都会被扫到spring容器中进行管理,也就是我们写的代码
第二个注解:@Import({AutoConfigurationImportSelector.class}),它的意思是把AutoConfigurationImportSelector.class文件加载到容器中
AutoConfigurationImportSelector的意思:自动配置导入选择器,进入AutoConfigurationImportSelector.class,找到重点方法selectImports()
启动项目,在方法下边打断点,可以看到加载了很多的配置类,自动加载到了容器中,并且配置完毕了,这就是使用srpingboot几乎零配置最主要的原因
自动配置的这些类在 springboot-autoconfigure 中都可以看到,如下图,这个包中集成几乎集成了所有的配置文件,而AutoConfigurationImportSelector配置类选择器就是把我们项目所需要的配置信息找到,然后把默认的配置内容导入到spring容器中进行管理
总结:根据项目来判断我们的项目需要哪些配置信息然后把默认的配置内容导入到spring容器中进行管理
3.@ComponentScan
@ComponentScan的作用很简单===》组件扫描和自动装配,用来指定扫描容器的范围
整体总结
总结放到了启动类代码注释上,请看代码。都看到这了,把你的赞留下再走。别忘了看看开始的图,加深理解。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
*@SpringBootConfiguration:springboot配置类-->@Configuration标明这是一个配置类-->@Component加载到容器
*@EnableAutoConfiguration:开启自动配置功能
* @AutoConfigurationPackage:自动配置包
* @Import({Registrar.class}):把启动类所在的包进行默认扫描,该包下所有的类都会被扫到spring容器中进行管理
* @Import({AutoConfigurationImportSelector.class}):spring的底层注解,作用是加载指定的类到spring容器中
* AutoConfigurationImportSelector.class:自动配置导入选择器
* 根据项目来判断你的项目需要哪些配置信息然后把默认的配置内容导入到spring容器中进行管理
*@ComponentScan-->组件扫描和自动装配,用来指定扫描容器的范围
*/
@SpringBootApplication //启动类注解
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}