要想了解 Springboot 自动配置的原理,我们就需要从启动类的?@SpringBootApplication 注解入手。
@SpringBootApplication 是 spring 的核心注解,被它标注的类有以下两个特点:
①?这个类是 SpringBoot 的主配置类。
②?SpringBoot 就应该运行这个类的 main 方法来启动 SpringBoot 应用。
下面是该注解的源代码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "nameGenerator"
)
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
- @SpringBootConfiguration:该注解表示这是一个 SpringBoot 的配置类,它就是一@Configuration 注解。
- @ComponentScan:开启组件扫描。
- @EnableAutoConfiguration:从名字来看,就是这个类开启自动配置的。
所以,我们继续走进?@EnableAutoConfiguration 源代码
@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 注解就是将主配置类(@SpringBootConfiguration标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器中。所以说,默认情况下主配置类包及子包以外的组件,Spring 容器是扫描不到的。
@Import({AutoConfigurationImportSelector.class}):该注解给当前配置类导入另外的 N 个自动配置类。
总结:
(1)SpringBoot启动会加载大量的自动配置类;
(2)看我们需要的功能有没有SpringBoot默认写好的自动配置类;
(3)我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再去配置了)
(4)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。
|