SpringBoot @SpringBootApplication注解

原创
2021/06/14 23:12
阅读数 121

SpringBoot 约定大于配置 的功力让我们如沐春风。用过Spring Boot的应该都知道,在项目启动入口的主类main()方法里,一句简简单单的便开启了项目的启动运行之路。

@SpringBootApplication
public class SpringApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringApplication.class, args);
	}

}

 

一、@SpringBootApplication注解

@SpringBootApplication 注解实际上是SpringBoot提供的一个复合注解,下面是2.3.3.RELEASE版本的源码。

@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:该注解的源码里面就是@Configuration注解,标注该类为配置类,并且把该类注入到Baen容器里面。
  • @EnableAutoConfiguration:该注解启用自动配置,把所有JavaConfig @Configuration 配置都加载到当前Bean容器里面。作为核心注解,会单独讲解。
  • @ComponentScan:该注解用于扫包,如:@Controller、@Entity、@Component、@Service等注解进行扫描。还可以通过 basePackages 属性来更细粒度的控制该注解的自动扫描范围,比如:@ComponentScan(basePackages = {"cn.codesheep.controller","cn.codesheep.entity"})

     

 

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

@EnableAutoConfiguration 借助 AutoConfigurationImportSelector 的帮助,而后者通过实现 selectImports() 方法来导出 Configuration。

这里isEnable()方法判断了是否开启自动配置,如果开启成功,则getProperty()。getProperty()本类中没有,那就是在他的父类中点击AutoConfigurationImportSelector找到selectImports()方法,这个方法的作用就是查询propertis文件加载全类名。我们继续看this.getCandidateConfigurations(annotationMetadata, attributes)这个方法。

我们看到调用了SpringFactoriesLoader这个类。

SpringFactoriesLoader.loadFactoryNames() 读取了 ClassPath 下面的 META-INF/spring.factories 文件来获取所有导出类。

我们在spring.factories文件中,发现了SpringBoot加载了很多开源技术,如rsocket、mongo、elasticsearch等。通过这个来完成自动装配的功能。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部