SpringBoot自动配置之@SpringBootApplication注解 - SpringBoot自动配置(一)

本文基于SpringBoot 2.5.7版本进行讲解

我们知道所有的SpringBoot应用的启动类都会有一个@SpringBootApplication注解。 这个注解就蕴含着SpringBoot自动配置的奥秘。

@SpringBootApplication是一个组合注解

@SpringBootApplication注解的部分源码如下:

@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 {
复制代码

我们可以看到,@SpringBootApplication是一个组合注解,它具有@SpringBootApplication@EnableAutoConfiguration@ComponentScan三个注解的作用。

@SpringBootConfiguration

@SpringBootConfiguration注解的源码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {

   @AliasFor(annotation = Configuration.class)
   boolean proxyBeanMethods() default true;

}
复制代码

可以看到@SpringBootConfiguration注解本质上也只是一个@Configuration注解,用于表示一个类是配置类。

类似于@Controller@Service注解其实本质上也是一个@Component注解,只是用于做语义化。@SpringBootConfiguration注解也是用来表示一个配置类是SpringBoot的配置类。

@ComponentScan

这个注解是Spring的注解,用来开启注解扫描,会扫描出所有标注了@Component注解的bean,并注入到容器中。这里不多做介绍。

@EnableAutoConfiguration

看名字就能知道,这个就是开启SpringBoot自动配置的核心注解。

@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 {};

}
复制代码

了解@Import注解的人就知道,这就是SpringBoot能够实现自动配置的原因了。

不了解@Import注解的,可以看Spring的@Import注解四种使用方式

AutoConfigurationImportSelector实现了DeferredImportSelector接口,而DeferredImportSelector接口又继承了ImportSelector接口。

因此,AutoConfigurationImportSelector类是ImportSelector的实现类。那么Spring就会将selectImports(AnnotationMetadata importingClassMetadata)方法返回的类全限定名数组对应的beans配置到容器中。

这样就SpringBoot就完成了自动配置的功能。

注:其实在SpringBoot中并不是通过AutoConfigurationImportSelectorselectImports()方法来获取需要配置的bean。后面我会写一篇文章讲解AutoConfigurationImportSelector在SpringBoot中如何加载Bean。

猜你喜欢

转载自juejin.im/post/7035138777450283038