Springboot的自动配置原理

2023年6月16日12:06:58

什么是Springboot的自动配置

Springboot:是对Spring框架做的一系列优化,减少了大量繁琐的配置,并提供了内置web服务器,让程序运行更快。

自动配置:用注解来对一些常规的配置做默认配置,简化xml配置内容,使你的项目能够快速运行。自动装配最明显的特征就是不用xml文件去做配置,而是用properties文件或者yml文件,简单地写一些坐标就能实现各类负载地配置。简单来说,就是自动将Bean装配到IOC容器中

为什么需要自动配置:无须各种的配置文件,无须各种繁杂的pom坐标,一个main方法,就能run起来。

Springboot自动配置的流程

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。

  • 作者:星星慢
  • 原文链接:https://blog.csdn.net/weixin_71118996/article/details/127124953
    更新时间:2023年6月16日12:06:58 ,共 2087 字。