springboot(四):springboot自动配置原理
springboot执行启动类后,为什么我们就可以直接使用http://localhost:8080/访问了呢?
我们查看启动类,发现特别的地方有两个:
注解:@SpringBootApplication
run方法:SpringApplication.run()
我们先看看注解@SpringBootApplication
在启动类上有注解@SpringBootApplication,查看@SpringBootApplication源码
从上面的源码我们主要看看@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan注解。
1、@SpringBootConfiguration
查看@SpringBootConfiguration源码
从@SpringBootConfiguration源码可以看到,在这个注解的上面有@Configuration注解,这个注解的作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了@Configuration
的类,并且读取其中的配置信息。而@SpringBootConfiguration
是来声明当前类是SpringBoot应用的配置类,项目中只能有一个。
2、@EnableAutoConfiguration
查看@EnableAutoConfiguration源码
接着查看AutoConfigurationImportSelector类
在AutoConfigurationImportSelector类中我们找到selectImports方法,在这个方法中查看调用的getCandidateConfigurations方法
其中,SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定
类对应的类名称列表。在这个方法出错时,会显示found in META-INF/spring.factories。
我们接着找到这个包(即:org.springframework.boot.autoconfigure)下面对应的META-INF/spring.factories文件,打开这个文件我们可以看到,spring.factories 文件中有关自动配置的配置信息,如:mvc的自动配置
以下就以mvc为例看一看
在spring.factories 文件中找到WebMvcAutoConfiguration,进入源码
查看WebMvcProperties源码,找到了内部资源视图解析器的prefix和suffix属性。
ResourceProperties中主要定义了静态资源(.js,.html,.css等)的路径:
此外,在WebMvcAutoConfiguration源码中,找到视图解析器相应的源码
处理器适配器(HandlerAdapter):
3、@ComponentScan
查看@ComponentScan源码
通过源码的注释我们可以了解到,这个注解的作用是配置组件扫描的指令,扫描的包是该类所在包及其子包。
所以,在我们写启动类时,一般都会放在一个比较前的包目录中。