3. SpringBoot运行原理剖析

3.1 SpringApplication类作用及run()方法作用

springboottest 指定启动类注解不生效 springboot启动类注解的作用_main函数

  • SpringApplication这个类整合了其他框架的启动类, 只要运行这一个类,所有的整合就都完成了.
  • 调用run函数, 将当前启动类的字节码传入, 以及main函数的args参数.
  • 通过获取当前启动类的核心信息, 创建IOC容器.

3.2 当前启动类@SpringBootApplication详细剖析

run函数传入的当前启动类字节码, 最重要的是传入了@SpringBootApplication, 点开该注解源码, 会发现有多个注解组成,接下来会一一解释每个注解的含义.

springboottest 指定启动类注解不生效 springboot启动类注解的作用_父类_02

  • JDK原生注解4个
@Target(ElementType.TYPE) //当前注解的使用范围
@Retention(RetentionPolicy.RUNTIME) //生命周期
@Documented //声明在生成doc文档时是否带着注解
@Inherited //声明是否子类会显示父类的注解
  • @SpringBootConfiguration
    点开该注解源码, 会发现本质是@Configuration
  • springboottest 指定启动类注解不生效 springboot启动类注解的作用_父类_03

  • 提到@Configuration就要提到他的搭档@Bean, 使用这两个注解就可以创建一个简单的Spring配置类, 可以用来替代相应的xml配置文件.可以理解为创建了IOC容器了.
  • @EnableAutoConfiguration, 点开源码会发现,本质是@import
  • springboottest 指定启动类注解不生效 springboot启动类注解的作用_字节码_04

  1. 能够自动配置Spring的上下文, 视图猜测和配置你想要的bean类, 会自动根据你的类路径和你的bean定义自动配置.
  2. 那么SpringBoot是如何完成自动配置的呢?
    A. SpringBoot自动配置的注解是 @EnableAutoConfiguration.
    B. 我们用的时候是在启动类上加@SpringBootApplication,这个注解是复合注解,内部包含 @EnableAutoConfiguration
    C. @EnableAutoConfiguration内部有一个@Import, 这个注解才是完成自动配置的关键.
    D. @Import导入一个类(AutoConfigurationImportSelector),这个类内部提供了一个方法(selectImports). 这个方法会扫描所有jar包下的spring.factories.解析文件中自动配置类key=value, 将列表中的类创建,并放到Spring容器中.
  • @ComponentScan
    会自动扫描指定包下的全部@Componetn的类, 并注册成bean对象.
    所以,为什么启动类要创建在base包(父包)下呢?
    原因就是当项目运行的时候,会通过@import注解自动扫描当前启动类所在包下及其子包下的所有内容.

3.3 总结

一个@SpringBootApplication注解就搞定了所有时, 它封装了核心的@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan这三个类,大大节省了程序员配置时间,这就是SpringBoot的核心设计思想.