Spring Boot 原理分析

作者: 右耳菌 | 来源:发表于2022-04-24 22:39 被阅读0次

Spring Boot 的启动类解析

  • @SpringBootApplication: Springboot启动类注解

    • 其中,启动类的代码如下所示
    package cn.lazyfennec.springboot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class HelloSpringbootApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HelloSpringbootApplication.class, args);
        }
    
    }
    
    • @SpringBootApplication 的源码如下所示
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package org.springframework.boot.autoconfigure;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.springframework.beans.factory.support.BeanNameGenerator;
    import org.springframework.boot.SpringBootConfiguration;
    import org.springframework.boot.context.TypeExcludeFilter;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    import org.springframework.context.annotation.ComponentScan.Filter;
    import org.springframework.core.annotation.AliasFor;
    
    @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;
    }
    

    可以看到@SpringBootApplication 这个注解中有三个重要的注解:

    1. @SpringBootConfiguration,表示是Springboot的配置类--> Configuration--> 标明是一个配置类

    2. @EnableAutoConfiguration:开启自动配置功能

      • @AutoConfigurationPackage :自动配置包
        • @Import(Register.class): 把启动类所在的包进行默认扫描。查看该Register类可以看到里边有个 static final class BasePackages ,通过打断点查看会发现,在没有做任何配置的情况下,packages 里边只有 xxxxApplcaition这个启动类所在的包,比如我们这里是 “cn.lazyfennec.springboot”,即表示,这种情况下,只有这个包(cn.lazyfennec.springboot)下的类、或者子包下的类会被自动扫描到,并加入到Spring的容器中进行管理
      • @Import({AutoConfigurationImportSelector.class}):加载指定的类到Spring容器中去
        • @Import(AutoConfigurationImportSelector.class):自动配置导入选择器,在该类中有方法“public Iterable<Entry> selectImports()”, 通过打断点发现有很多配置类的信息,如下所,表示根据项目来判断本项目需要哪些配置信息,然后把默认的配置内容导入到Spring容器中进行管理。
        AutoConfigurationImportSelector selectImports()
    3. @ComponentScan:组件扫描和自动装配,用来指定扫描容器的范围。

  • 根据以上各个注解的关系可以作出如下的关系图

SpringBootApplication注解的图解分析

更多知识,请点击关注查看我的主页信息哦

相关文章

网友评论

    本文标题:Spring Boot 原理分析

    本文链接:https://www.haomeiwen.com/subject/rnjxyrtx.html