@springbootApplication注解
实现自动装配的核心就是@EnableAutoConfiguration。(springboot就是通过此注解实现自动装配机制,主要作用就是让springboot去扫描默认的配置类,如果没有这个类的话,springboot只会默认扫描启动类下包中各个类的注解)
@Import注解的作用就是将对应的类配置到ioc容器中,这里就是AutoConfigurationImportSelector类配置到ioc容器中。
AutoConfigurationImportSelector类
这个类的作用就是自动配置类选择器。
该配置类会通过此方法getAutoConfigurationEntry获取获取要自动配置的类。(此时就扫描了这146个默认配置类)
启动进行DEBUG,可以看到有146个自动装配类,在断点处会执行getCandidateConfigurations方法。
在这些扫描到的默认配置类中只要有@AutoConfiguration注解并且没有对应的导入限制,就进行自动装配。 (在默认的配置类范围内识别)
导入不成功例子:
在此配置类中还需要ioc容器中存在相应的类才能执行自动装配,所以146个配置类并表示都进行配置的。
默认的配置类范围内在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.
总共默认自动装配的类有146个xxxxAutoConfiguration配置类
自动配置类与application.yml绑定原理
例子:平时我们想要改tomcat的端口号时只需要在application.yml中修改就可以生效,分析源码。
在ServletWebServerFactoryAutoConfiguration配置类中有:
@EnableConfigurationProperties(ServerProperties.class)
就是将外部引入的serverProperties类配置到ioc容器中。
ServerProperties类使用@ConfigurationProperties注解将applicatinon.yml中以server为前缀的配置信息赋给ServerProperties类。(此时此类就有port的值,也就是端口号的值)
在返回servletweb工厂中,也就是ServletWebServerFactoryCustomizer类
在ServletWebServerFactoryCustomizer类中,因为传入了serverProperties类,最终就可以获取在application.yml中配置的端口号,实现tomcat的端口号更改。
其他的配置类和application.yml的属性绑定的步骤和此处的步骤一致。
总流程图
核心流程总结:
1、导入starter
,就会导入autoconfigure
包。
2、autoconfigure
包里面 有一个文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
,里面指定的所有启动要加载的自动配置类
3、@EnableAutoConfiguration 会自动的把上面文件里面写的所有自动配置类都导入进来。xxxAutoConfiguration 是有条件注解进行按需加载
4、xxxAutoConfiguration
给容器中导入一堆组件,组件都是从 xxxProperties
中提取属性值
5、xxxProperties
又是和配置文件进行了绑定
效果:导入starter
、修改配置文件,就能修改底层行为。