SpringBoot(图解)

SpringBoot源码剖析

  • 依赖管理 Spirng-boot-start-parent

    ​ 问题: (1) 问么导入dependency时可以不用指定版本?

    在SpringBoot入门程序中引入的依赖中有个核心依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.9</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    

    Ctrl+鼠标左键点击org.springframework.boot进入SpringBoot自带的pom文件中 这里解释了 为什么配置文件要以application开头,要以yml,yaml,properties结尾的原因。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WX2mGPrO-1643118773421)(C:\Users\19637\AppData\Roaming\Typora\typora-user-images\image-20220125174125726.png)]

在进入的新pom文件中Ctrl+鼠标左键点击org.springframework.boot进入下一个pom文件,这里对我们常用的依赖做了版本仲裁 所以我们在导入dependency时可以不用加version

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uUrrlFl7-1643118773422)(C:\Users\19637\AppData\Roaming\Typora\typora-user-images\image-20220125174304144.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DqhO8plX-1643118773423)(C:\Users\19637\AppData\Roaming\Typora\typora-user-images\image-20220125174507254.png)]

需要说明的是,如果我们导入的依赖在SpringBoot中没有申明我们仍然需要加入version。如果想不用SpirngBoot中声明的版本,我们可以在依赖下方加入version 换成自己想要的版本。

  • SpringBoot-starter-web依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

引入这个依赖会引入SpringMVC 并且引入tomcat作为内置容器启动

这就是SpringBoot-starter-web依赖引入的依赖

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.5.9</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
    <version>2.5.9</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>2.5.9</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.3.15</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.15</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

SpringBoot除了Web依赖启动器 还有其他的场景启动器

https://docs.spring.io/spring-boot/docs/2.5.9/reference/html/using.html#using.build-systems.starters在此链接中可以查看其他场景启动器

需要说明的是,SpringBoot官方没有对所有场景开发提供了启动器。例如Mybatis,但是Mybatis团队主动与SpirngBoot框架进行了整合,实现了自己的依赖启动器。例如mybatis-spring-boot-stater。引用第三方依赖启动器时要指定版本号。

  • SpringBoot的自动配置

    ​ SpringBoot是怎么自动配置的 配置了哪些?

    根据主启动类的@SpringBootApplication解决问题

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

    Ctrl+鼠标左键@SpringBootApplication进入发现@SpringBootApplication是一个组合注解

    @Target(ElementType.TYPE) //注解可以标注的地方
    @Retention(RetentionPolicy.RUNTIME) //注解生命周期
    @Documented //注解可以记录在javdoc中
    @Inherited //表示可以被子类继承注解
    -----------------------------下方为重点----------------------------
    @SpringBootConfiguration //标注类为配置类 (内部被@Configuration标注)
    @EnableAutoConfiguration//开启自动配置
    @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
          @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) //包扫描
    public @interface SpringBootApplication {
        。。。。。。。
    }
    

    1.查看一下开启自动配置的注解@EnableAutoConfiguration

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    ---------------------------------------------
    @AutoConfigurationPackage //会把@SpringBootApplication注解标注的类所在包的所有组件进行注册
    @Import(AutoConfigurationImportSelector.class) //导入AutoConfigurationImportSelector组件
    public @interface EnableAutoConfiguration {
        。。。。。。。。
    }
    

    1.1查看@AutoConfigurationPackage注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
------------------------------------------------------------
@Import(AutoConfigurationPackages.Registrar.class) //导入组件
public @interface AutoConfigurationPackage {
    
}

​ 1.1.1进入Registrar.class中

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {

   @Override
   public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
       //这里是对SpringBoot主启动类所在包的所有组件进行注册
      register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
   }

   @Override
   public Set<Object> determineImports(AnnotationMetadata metadata) {
      return Collections.singleton(new PackageImports(metadata));
   }

}

1.2.1进入Import注解中的AutoConfigurationImportSelector类中

​ 在这个类中有一个方法,表示了要导入哪些组件

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    //判断有没有开启@EnableAutoConfiguration(默认开启)
   if (!isEnabled(annotationMetadata)) {
      return NO_IMPORTS;
   }
    //在这里面会加载自动配置类
    //在这里会一步步到AutoConfigurationMetadataLoader类
    //在AutoConfigurationMetadataLoader类中标注了扫描自动配置配置文件的路径
   AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
   return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIw4KGwX-1643118773423)(C:\Users\19637\AppData\Roaming\Typora\typora-user-images\image-20220125185821947.png)]
这个就是配置文件中的内容

内容命名规则:类的全限定名.条件=值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7aBZHbo6-16431187734)(C:\Users\19637\AppData\Roaming\Typora\typora-user-images\image-20220125190114155.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值