SpringBoot原理解析(精华版)

1.1 起步依赖原理分析

SpringBoot原理解析(精华版)_第1张图片

1.1.1 分析spring-boot-started-parent

  •  按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配置如下(只摘抄了部分重点配置):

    org.springframework.boot
    spring-boot-dependencies
    2.0.1.RELEASE
    ../../spring-boot-dependencies

  •  按住Ctrl点击pom.xml中的spring-boot-starter-dependencies,跳转到了spring-boot-starter-dependencies的pom.xml,xml配置如下(只摘抄了部分重点配置):

    5.15.3
    2.7.7
    1.9.63
    2.4.0
    1.8.13
    3.9.1
    4.0.6
    2.1.4
    3.0.0
……


    
        
            org.springframework.boot
            spring-boot
            2.0.1.RELEASE
        
        
            org.springframework.boot
            spring-boot-test
            2.0.1.RELEASE
        
        ……



    
        
            
                org.jetbrains.kotlin
                kotlin-maven-plugin
                ${kotlin.version}
            
            
                org.jooq
                jooq-codegen-maven
                ${jooq.version}
            
           ………
        
    

  •  从上面的spring-boot-starter-dependencies的pom.xml中我们可以发现,一部分坐标的版本、依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了。所以起步依赖的作用就是进行依赖的传递

1.1.2  分析spring-boot-starter-web 

  • 按住Ctrl点击pom.xml中的spring-boot-starter-web,跳转到了spring-boot-starter-web的pom.xml,xml配置如下(只摘抄了部分重点配置):



  4.0.0
  
    org.springframework.boot
    spring-boot-starters
    2.0.1.RELEASE
  
  org.springframework.boot
  spring-boot-starter-web
  2.0.1.RELEASE
  Spring Boot Web Starter

    
      org.springframework.boot
      spring-boot-starter
      2.0.1.RELEASE
      compile
    
    
      org.springframework.boot
      spring-boot-starter-json
      2.0.1.RELEASE
      compile
    
    
      org.springframework.boot
      spring-boot-starter-tomcat
      2.0.1.RELEASE
      compile
    
    
      org.hibernate.validator
      hibernate-validator
      6.0.9.Final
      compile
    
    
      org.springframework
      spring-web
      5.0.5.RELEASE
      compile
    
    
      org.springframework
      spring-webmvc
      5.0.5.RELEASE
      compile
    
  

  •  从上面的spring-boot-starter-web的pom.xml中我们可以发现,spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用

 1.1.3 总结起步依赖原理

1)parent:扫描配置文件和锁定jar包版本

SpringBoot原理解析(精华版)_第2张图片

2)起步依赖:导入jar包和锁定jar包版本

SpringBoot原理解析(精华版)_第3张图片 

  • SpringBoot的父工程 spring-boot-starter-parent已经导入了所有的jar包,我们项目中是否不需要导包?
    不对,它只是进行了版本锁定和扫描配置文件

2.1 自动配置原理解析

 按住Ctrl点击查看启动类MySpringBootApplication上的注解@SpringBootApplication

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

注解@SpringBootApplication的源码

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

   /**
    * Exclude specific auto-configuration classes such that they will never be applied.
    * @return the classes to exclude
    */
   @AliasFor(annotation = EnableAutoConfiguration.class)
   Class[] exclude() default {};

   ……
}

其中:

@SpringBootConfiguration:等同与@Configuration,既标注该类是Spring的一个配置类

@EnableAutoConfiguration:SpringBoot自动配置功能开启

按住Ctrl点击查看注解@EnableAutoConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
        ………
}

其中,@Import(AutoConfigurationImportSelector.class) 导入了AutoConfigurationImportSelector类

按住Ctrl点击查看AutoConfigurationImportSelector源码

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) {
      return NO_IMPORTS;
   }
   AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
         .loadMetadata(this.beanClassLoader);
   AnnotationAttributes attributes = getAttributes(annotationMetadata);
   List configurations = getCandidateConfigurations(annotationMetadata,
         attributes);
   configurations = removeDuplicates(configurations);
   Set exclusions = getExclusions(annotationMetadata, attributes);
   checkExcludedClasses(configurations, exclusions);
   configurations.removeAll(exclusions);
   configurations = filter(configurations, autoConfigurationMetadata);
   fireAutoConfigurationImportEvents(configurations, exclusions);
   return StringUtils.toStringArray(configurations);
}

protected List getCandidateConfigurations(AnnotationMetadata metadata,
      AnnotationAttributes attributes) {
   List configurations = SpringFactoriesLoader.loadFactoryNames(
         getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
   Assert.notEmpty(configurations,
         "No auto configuration classes found in META-INF/spring.factories. If you "
               + "are using a custom packaging, make sure that file is correct.");
   return configurations;
}

其中,SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定类对应的类名称列表

SpringBoot原理解析(精华版)_第4张图片

spring.factories 文件中有关自动配置的配置信息如下:

……
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
……

 

上面配置文件存在大量的以Configuration为结尾的类名称,这些类就是存有自动配置信息的类,而

SpringApplication在获取这些类名后再加载

我们以ServletWebServerFactoryAutoConfiguration为例来分析源码:

@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
      ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
      ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
      ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
           … … …
}

其中,

@EnableConfigurationProperties(ServerProperties.class) 代表加载ServerProperties服务器配置属性类

 

进入ServerProperties.class源码如下:

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
   /**Server HTTP port. */
   private Integer port;
   /**Network address to which the server should bind. */
   private InetAddress address;
   … … …
}

其中,

prefix = "server" 表示SpringBoot配置文件中的前缀,SpringBoot会将配置文件中以server开始的属性映射到该类的字段中。映射关系如下:

SpringBoot原理解析(精华版)_第5张图片

 

  •  总结:在SpringBoot的自动配置中,自动配置tomcat的端口号 port 的前缀是什么? server

你可能感兴趣的:(SpringBoot)