Springboot:是对Spring框架做的一系列优化,减少了大量繁琐的配置,并提供了内置web服务器,让程序运行更快。
自动配置:用注解来对一些常规的配置做默认配置,简化xml配置内容,使你的项目能够快速运行。自动装配最明显的特征就是不用xml文件去做配置,而是用properties文件或者yml文件,简单地写一些坐标就能实现各类负载地配置。简单来说,就是自动将Bean装配到IOC容器中。
为什么需要自动配置:无须各种的配置文件,无须各种繁杂的pom坐标,一个main方法,就能run起来。
Springboot的启动类,启动类的main方法 上有一个Springboot的核心注解@SpringbootApplication
点进去SpringbootApplication注解看
- @Target({ElementType.TYPE}) //修饰类或接口、枚举
- @Retention(RetentionPolicy.RUNTIME)//注解在源码,class文件中存在且运行时可以通过反射机制获取到
- @Documented//可以在api文档显示
- @Inherited//子类可以继承该注解
- @SpringBootConfiguration //配置类
- @EnableAutoConfiguration//开启自动装配
- @ComponentScan //扫描 (不指明包名则默认范围自己所在包及其子类下)
- (
- excludeFilters = {@Filter(
- type = FilterType.CUSTOM,
- classes = {TypeExcludeFilter.class}
- ), @Filter(
- type = FilterType.CUSTOM,
- classes = {AutoConfigurationExcludeFilter.class}
- )}
- )
关键作用的注解是@EnableAutoConfiguration,根据名称翻译就是开启自动配置。而@EnableAutoConfiguration也是一个复合注解,它包含了@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})。
- @Target({ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Inherited
- @AutoConfigurationPackage
- @Import({AutoConfigurationImportSelector.class})
- public @interface EnableAutoConfiguration {
- String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
-
- Class>[] exclude() default {};
-
- String[] excludeName() default {};
- }
可以看到@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})注解加起来就是实现了自动配置的关键。
@AutoConfigurationPackage注解,从字面意思上来看就是自动配置包。点进去可以看到就是⼀个 @Import 注解:@Import(AutoConfigurationPackages.Registrar.class) ,导⼊了⼀个Registrar 的组件,这个注解的作用就是将主配置类(@SpringBootConfiguration标注的类)所在的包及其下面所有子包里面所有的组件扫描到IOC容器中。所以说,默认情况下主配置类所在包及其子包以外的组件,Spring IOC容器是扫描不到的。
@Import(AutoConfigurationImportSelector.class)注解通过@Import导入了AutoConfigurationImportSelector类,而这个类的selectImports方法会通过SpringFactoriesLoader得到大量的配置类。而每个配置类则根据条件化配置类做出决策,以实现自动配置的功能。
我们写配置类只需要加入一个@Configuration注解,Springboot就可以轻松地自己找到想要地目标文件。
总结:
1.@EnableAutoConfiguration注解内部使用@Import(AutoConfigurationImportSelector.class)来加载配置类。
2.配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当Springboot应用启动的时候,会自动加载这些配置类,初始化Bean。
3.并不是所有的Bean都会被初始化,需要在配置类中使用Condition来加载满足条件的Bean。