springboot-boot-starter-xxxx:场景启动器
springboot-boot-stater-web:帮我们导入web模块正常运行所需要的组建
@SpringBootApplication:声明这是springboot的主配置类 进入这个注解
@ComponentScan:相当于开启spring注解扫描
@SpringBootConfiguration:springboot的配置类,点进去发现,
@Configuration表示这是一个配置类
@Component表示这也是一个bean组件,负责启动程序
@EnableAutoConfiguration:开启自动配置 点进去
@AutoConfigurationPackage :自动配置包
@Import({Registrar.class}):将主启动类所在包及包下面所有子包的所有组件扫描到Spring容器
@Import(AutoConfigurationImportSelector.class):给容器导入组建
AutoConfigurationImportSelector:自动导入选择器
1. 获取候选的配置,兜兜转转找到"META-INF/spring.factories"文件
2.读取这个文件,并封装成Properties,此文件全是等待自动配置类的全路径
3. 在springboot-autoconfigure的jar包中的spring.factories下随便打开一个类进行分析, (Http编码自动配置)为例进行分析。
~~~java @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties({HttpProperties.class}) @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass({CharacterEncodingFilter.class}) ~~~1.@Configuration( proxyBeanMethods = false )
表示这是一个配置类,可以给容器添加组件。
2.@EnableConfigurationProperties({HttpProperties.class})
使使用 @ConfigurationProperties 注解生效。
进入 HttpProperties
3.@ConfigurationProperties( prefix = “spring.http”)
将配置文件和 HttpProperties 绑定起来。(从配置文件中获取指定的值,和bean的属性进行绑定)
看到这个注解,有点熟悉,在上一篇yaml配置文件中学到,将yaml中的值注入到所需类中时,用的就是这个注 解:
将配置文件中配置的每一个属性的值,映射到该组件中告诉SpringBoot将该类中的所有属性和配置文件中相关的配置进行绑定4.@ConditionalOnWebApplication( type = Type.SERVLET )
@Conditional Spring的底层注解,判断作用:如果满足指定条件,整个配置类里面的配置才会生效。
5.@ConditionalOnClass({CharacterEncodingFilter.class})
判断当前项目中是否存在 CharacterEncodingFilter 类(SpringMVC中乱码解决的过滤器)
结论:
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;整个J2EE自动配置都在springboot-autoconfigure的jar包中;它会根据条件(启动器)给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;