SpringBoot——启动源码(一)

SpringBootApplication注解

  • 前言
  • SpringBootApplication
    • SpringBootConfiguration
    • EnableAutoConfiguration
      • import注解
    • ComponentScan
  • 总结

前言

Springboot作为Spring的脚手架,其本质核心并不提供Spring核心功能,作用就是开发者快速构建,预置三方配置、开箱即用的目的。“习惯优于配置”。

SpringBootApplication

这个是一个组合注解,它实质由SpringBootConfiguration,EnableAutoConfiguration,CompnentScan三个注解组成。意思是SpringBoot启动配置加载,自动配置,组件扫描都是从这里开始。
SpringBoot——启动源码(一)_第1张图片
SpringBoot——启动源码(一)_第2张图片

SpringBootConfiguration

就是spring的@Configuration替代,唯一区别就是它在写测试类的时候,可以自动查找配置。@DataJpaTest会首先寻找当前包中的@SpringBooConfiguration注解,找不到,去包的层次结构中找,直到找到为止。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration//就可以看出它就是Spring的Configuration的替代,只是有些测试注解会主动寻找它,所以它对于测试很方便
public @interface SpringBootConfiguration {

EnableAutoConfiguration

开启自动配置,这是springboot自动配置的关键。通过AutoConfigurationPackage注解导入自动扫描包注册器@Import(AutoConfigurationPackages.Registrar.class);@Import直接导入AutoConfigurationImportSelector.class这是自动配置的关键。

import注解

原生spring框架组件装配经历了三个阶段:

  1. spring2.5+ @Component装配bean
  2. spring3.0+ @Configuration+@Bean,项目启动后bean注入到容器
  3. spring3.1+@Enablexxx+@Import,模块装配注入容器

它可以将@Configuration,ImportSelectorImportBeanDefinitionRegistrar普通的component类导入.

ComponentScan

开启组件扫描,扫描出所有标注@Component注解的bean,作为组件注入到容器。
exclude 和 excludeName 属性来配置不需要实现自动装配的类或类名,也可以通过 scanBasePackages 和 scanBasePackageClasses 属性来配置需要进行扫描的包路径和类路径。

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

总结

springboot启动传入当前启动类class,不是必须的,而是哪个类标记了注解@SpringBootApplication,传入哪个类,这个注解提供了,容器的配置,自动装配,组件扫描,这才是启动的基础。

//@SpringBootApplication 在CookTool标注@SpringApplication,一样可以启动
public class SpringSourceRead {
    public static void main(String[] args) {
        SpringApplication.run(CookTool.class, args);
    }

你可能感兴趣的:(spring,boot,spring,java)