SpringBoot原理分析

一共两块内容: 起步依赖和自动配置
1.起步依赖
这个可以理解为: 对功能的一个打包。

在新建SpringBoot项目时,不用再去配置很多pom文件中依赖,这是因为SpringBoot的起步依赖。
SpringBoot在使用时,有几个必须的dependency对象,第一个是spring-boot-starter-parent
按住Ctrl点击pom.xml中的spring-boot-starter-parent,可以看到了spring-boot-starter-parent的pom.xml,可以看到parent中的内容,这个相当于SpringBoot的父级:

<modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath>../../spring-boot-dependencies</relativePath>
    </parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <packaging>pom</packaging>
    <name>Spring Boot Starter Parent</name>
    <description>Parent pom providing dependency and plugin management for applications
		built with Maven</description>
    <url>https://projects.spring.io/spring-boot/#/spring-boot-starter-parent</url>
    <properties>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <resource.delimiter>@</resource.delimiter>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>
    ........................................
    ........................................
<resource>
                <filtering>true</filtering>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                    <include>**/application*.yml</include>
                    <include>**/application*.yaml</include>
                    <include>**/application*.properties</include>
                </includes>
            </resource>

表示springBoot让我们配置的文件是".yml",".yaml"和".properties",并以application开头

在parent里,再点击spring-boot-dependencies(可以认为SpringBoot的爷爷级),可以看到有以下内容:

<properties>
        <activemq.version>5.15.3</activemq.version>
        <antlr2.version>2.7.7</antlr2.version>
        <appengine-sdk.version>1.9.62</appengine-sdk.version>
        <artemis.version>2.4.0</artemis.version>
        <aspectj.version>1.8.13</aspectj.version>
        <assertj.version>3.9.1</assertj.version>
        <atomikos.version>4.0.6</atomikos.version>
        <bitronix.version>2.1.4</bitronix.version>
        <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
        <byte-buddy.version>1.7.10</byte-buddy.version>
        <caffeine.version>2.6.2</caffeine.version>
        <cassandra-driver.version>3.4.0</cassandra-driver.version>
        <classmate.version>1.3.4</classmate.version>
        <commons-codec.version>1.11</commons-codec.version>
        <commons-dbcp2.version>2.2.0</commons-dbcp2.version>
        <commons-lang3.version>3.7</commons-lang3.version>
        <commons-pool.version>1.6</commons-pool.version>
        <commons-pool2.version>2.5.0</commons-pool2.version>
        <couchbase-cache-client.version>2.1.0</couchbase-cache-client.version>
        <couchbase-client.version>2.5.5</couchbase-client.version>
        <derby.version>10.14.1.0</derby.version>
        <dom4j.version>1.6.1</dom4j.version>
        <dropwizard-metrics.version>3.2.6</dropwizard-metrics.version>
        <ehcache.version>2.10.4</ehcache.version>
        <ehcache3.version>3.5.0</ehcache3.version>
        <elasticsearch.version>5.6.8</elasticsearch.version>
        <embedded-mongo.version>2.0.3</embedded-mongo.version>
        <exec-maven-plugin.version>1.5.0</exec-maven-plugin.version>
        <flatten-maven-plugin.version>1.0.0</flatten-maven-plugin.version>
        <flyway.version>5.0.7</flyway.version>
        <freemarker.version>2.3.27-incubating</freemarker.version>
        <git-commit-id-plugin.version>2.2.3</git-commit-id-plugin.version>
        <glassfish-el.version>3.0.0</glassfish-el.version>
        <groovy.version>2.4.13</groovy.version>
        <gson.version>2.8.2</gson.version>
        <h2.version>1.4.196</h2.version>
        <hamcrest.version>1.3</hamcrest.version>
        <hazelcast.version>3.9.3</hazelcast.version>
        <hazelcast-hibernate5.version>1.2.3</hazelcast-hibernate5.version>
        <hibernate.version>5.2.14.Final</hibernate.version>
        <hibernate-validator.version>6.0.7.Final</hibernate-validator.version>
        <hikaricp.version>2.7.8</hikaricp.version>
        <hsqldb.version>2.4.0</hsqldb.version>
        <htmlunit.version>2.29</htmlunit.version>
        <httpasyncclient.version>4.1.3</httpasyncclient.version>
        <httpclient.version>4.5.5</httpclient.version>
        <httpcore.version>4.4.9</httpcore.version>
        <infinispan.version>9.1.6.Final</infinispan.version>
        <influxdb-java.version>2.9</influxdb-java.version>
        <jackson.version>2.9.4</jackson.version>
        <janino.version>3.0.8</janino.version>
        <javax-annotation.version>1.3.2</javax-annotation.version>
        <javax-cache.version>1.1.0</javax-cache.version>
        <javax-jaxb.version>2.3.0</javax-jaxb.version>
        <javax-jms.version>2.0.1</javax-jms.version>
        <javax-json.version>1.1.2</javax-json.version>
        <javax-jsonb.version>1.0</javax-jsonb.version>
        <javax-mail.version>1.6.1</javax-mail.version>
        <javax-money.version>1.0.1</javax-money.version>
        <javax-transaction.version>1.2</javax-transaction.version>
        <javax-validation.version>2.0.1.Final</javax-validation.version>
        <jaxen.version>1.1.6</jaxen.version>
        <jaybird.version>3.0.3</jaybird.version>
        <jboss-logging.version>3.3.2.Final</jboss-logging.version>
        <jboss-transaction-spi.version>7.6.0.Final</jboss-transaction-spi.version>
        <jdom2.version>2.0.6</jdom2.version>
        <jedis.version>2.9.0</jedis.version>
        <jersey.version>2.26</jersey.version>
        <jest.version>5.3.3</jest.version>
        <jetty.version>9.4.8.v20171121</jetty.version>
        <jetty-el.version>8.5.24.2</jetty-el.version>
        <jetty-jsp.version>2.2.0.v201112011158</jetty-jsp.version>
        <jmustache.version>1.14</jmustache.version>
        <jna.version>4.5.1</jna.version>
        <joda-time.version>2.9.9</joda-time.version>
        <johnzon-jsonb.version>1.1.6</johnzon-jsonb.version>
        <jolokia.version>1.5.0</jolokia.version>
        <jooq.version>3.10.5</jooq.version>
        <jsonassert.version>1.5.0</jsonassert.version>
        <json-path.version>2.4.0</json-path.version>
        <jstl.version>1.2</jstl.version>
        <jtds.version>1.3.1</jtds.version>
        <junit.version>4.12</junit.version>
        <junit-jupiter.version>5.1.0</junit-jupiter.version>
        <junit-platform.version>1.1.0</junit-platform.version>
        <kotlin.version>1.2.21</kotlin.version>
        <lettuce.version>5.0.2.RELEASE</lettuce.version>
        <liquibase.version>3.5.5</liquibase.version>
        <log4j2.version>2.10.0</log4j2.version>
        <logback.version>1.2.3</logback.version>
        <lombok.version>1.16.20</lombok.version>
        <mariadb.version>2.2.2</mariadb.version>
        <maven-antrun-plugin.version>1.8</maven-antrun-plugin.version>
        <maven-assembly-plugin.version>3.1.0</maven-assembly-plugin.version>
        <maven-clean-plugin.version>3.0.0</maven-clean-plugin.version>
        <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
        <maven-dependency-plugin.version>3.0.1</maven-dependency-plugin.version>
        <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
        <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version>
        <maven-enforcer-plugin.version>3.0.0-M1</maven-enforcer-plugin.version>
        <maven-failsafe-plugin.version>2.20.1</maven-failsafe-plugin.version>
        <maven-help-plugin.version>2.2</maven-help-plugin.version>
        <maven-install-plugin.version>2.5.2</maven-install-plugin.version>
        <maven-invoker-plugin.version>3.0.0</maven-invoker-plugin.version>
        <maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
        <maven-javadoc-plugin.version>3.0.0-M1</maven-javadoc-plugin.version>
        <maven-resources-plugin.version>3.0.1</maven-resources-plugin.version>
        <maven-shade-plugin.version>2.4.3</maven-shade-plugin.version>
        <maven-site-plugin.version>3.6</maven-site-plugin.version>
        <maven-source-plugin.version>3.0.1</maven-source-plugin.version>
        <maven-surefire-plugin.version>2.20.1</maven-surefire-plugin.version>
        <maven-war-plugin.version>3.1.0</maven-war-plugin.version>
        <micrometer.version>1.0.1</micrometer.version>
        <mockito.version>2.15.0</mockito.version>
        <mongodb.version>3.6.3</mongodb.version>
        <mongo-driver-reactivestreams.version>1.7.1</mongo-driver-reactivestreams.version>
        <mssql-jdbc.version>6.2.2.jre8</mssql-jdbc.version>
        <mysql.version>5.1.45</mysql.version>
        <narayana.version>5.8.0.Final</narayana.version>
        <nekohtml.version>1.9.22</nekohtml.version>
        <neo4j-ogm.version>3.1.0</neo4j-ogm.version>
        <netty.version>4.1.22.Final</netty.version>
        <nio-multipart-parser.version>1.1.0</nio-multipart-parser.version>
        <postgresql.version>42.2.1</postgresql.version>
        <quartz.version>2.3.0</quartz.version>
        <querydsl.version>4.1.4</querydsl.version>
        <rabbit-amqp-client.version>5.1.2</rabbit-amqp-client.version>
        <reactive-streams.version>1.0.2</reactive-streams.version>
        <reactor-bom.version>Bismuth-SR7</reactor-bom.version>
        <rest-assured.version>3.0.7</rest-assured.version>
        <rxjava.version>1.3.6</rxjava.version>
        <rxjava2.version>2.1.10</rxjava2.version>
        <rxjava-adapter.version>1.2.1</rxjava-adapter.version>
        <selenium.version>3.9.1</selenium.version>
        <selenium-htmlunit.version>2.29.2</selenium-htmlunit.version>
        <sendgrid.version>4.1.2</sendgrid.version>
        <servlet-api.version>3.1.0</servlet-api.version>
        <simple-json.version>1.1.1</simple-json.version>
        <slf4j.version>1.7.25</slf4j.version>
        <snakeyaml.version>1.19</snakeyaml.version>
        <solr.version>6.6.2</solr.version>
        <spring.version>5.0.4.RELEASE</spring.version>
        <spring-amqp.version>2.0.2.RELEASE</spring-amqp.version>
        <spring-batch.version>4.0.0.RELEASE</spring-batch.version>
        <spring-cloud-connectors.version>2.0.1.RELEASE</spring-cloud-connectors.version>
        <spring-data-releasetrain.version>Kay-SR5</spring-data-releasetrain.version>
        <spring-hateoas.version>0.24.0.RELEASE</spring-hateoas.version>
        <spring-integration.version>5.0.3.RELEASE</spring-integration.version>
        <spring-kafka.version>2.1.4.RELEASE</spring-kafka.version>
        <spring-ldap.version>2.3.2.RELEASE</spring-ldap.version>
        <spring-plugin.version>1.2.0.RELEASE</spring-plugin.version>
        <spring-restdocs.version>2.0.0.RELEASE</spring-restdocs.version>
        <spring-retry.version>1.2.2.RELEASE</spring-retry.version>
        <spring-security.version>5.0.3.RELEASE</spring-security.version>
        <spring-session-bom.version>Apple-SR1</spring-session-bom.version>
        <spring-ws.version>3.0.0.RELEASE</spring-ws.version>
        <sqlite-jdbc.version>3.21.0.1</sqlite-jdbc.version>
        <statsd-client.version>3.1.0</statsd-client.version>
        <sun-mail.version>1.6.1</sun-mail.version>
        <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
        <thymeleaf-extras-data-attribute.version>2.0.1</thymeleaf-extras-data-attribute.version>
        <thymeleaf-extras-java8time.version>3.0.1.RELEASE</thymeleaf-extras-java8time.version>
        <thymeleaf-extras-springsecurity4.version>3.0.2.RELEASE</thymeleaf-extras-springsecurity4.version>
        <thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
        <tomcat.version>8.5.28</tomcat.version>
        <unboundid-ldapsdk.version>4.0.4</unboundid-ldapsdk.version>
        <undertow.version>1.4.22.Final</undertow.version>
        <versions-maven-plugin.version>2.3</versions-maven-plugin.version>
        <webjars-hal-browser.version>3325375</webjars-hal-browser.version>
        <webjars-locator-core.version>0.35</webjars-locator-core.version>
        <wsdl4j.version>1.6.3</wsdl4j.version>
        <xml-apis.version>1.4.01</xml-apis.version>
        <xml-maven-plugin.version>1.0.1</xml-maven-plugin.version>
        <xmlunit2.version>2.5.1</xmlunit2.version>
    </properties>

这里也就Maven集成jar的配置。

SpringBoot的pom.xml中,不同的SpringBoot配置的底层,都是集成的Maven。
所以说,一个SpringBoot的配置,就是对一个功能的打包。

2.自动配置:
在学习Demo时,可以发现,我们自己编写一个Controller类,加上 @Controller 的注解,就可以实现在浏览器对Controlle中方法的访问。这个因为,其基于SpringBoot的自动配置,那么,这部分隐藏在哪呢?
核心就是SpringBoot工程的入口是@SpringBootApplication,按住Ctrl点击此注解,如下:

@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}
)}
)

@SpringBootConfiguration和@Configuration作用是相同的
@ComponentScan是组件扫描,而它的规则是引导类(类上有@SpringBootApplication注解)所在的包及其子包都会扫描
所以当我们配置了@Controller后,并没有配置扫描包,一样能扫描到
而其中的自动配置的关键就是:@EnableAutoConfiguration

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

里面有一个@Import注解,表示当前注解引入AutoConfigurationImportSelector.class,所以
AutoConfigurationImportSelector有的功能 EnableAutoConfiguration也会存在。进入AutoConfigurationImportSelector,有一个selectImports()方法:
在这里插入图片描述
getCandidateConfigurations方法中如下:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.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;
    }

所以spring-boot-starter-parent作用主要是我们的SpringBoot工程继承spring-boot-starter-parent后已SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定类对应的类名称列表,这里就是AutoConfigurationImportSelector类所在的org.springframework.boot.autoconfigure,而“No auto configuration classes found in META-INF/spring.factories. If you…”说明在包下存在一个META-INF/spring.factories文件:
在这里插入图片描述

在ServletWebServerFactoryAutoConfiguration中有个:@EnableConfigurationProperties({ServerProperties.class})

打开ServerProperties.class,中有:
@ConfigurationProperties(prefix = “server”, ignoreUnknownFields = true)注解:
在这里插入图片描述
prefix = “server” 表示SpringBoot配置文件中的前缀,SpringBoot会将配置文件中以server开始的属性映射到该类的字段中,而这个配置文件就是和spring.factories在同一目录下的spring-configuration-metadata.json文件 “name”: “server.port”,

{
      "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties",
      "defaultValue": 8080,
      "name": "server.port",
      "description": "Server HTTP port.",
      "type": "java.lang.Integer"
    },

这里就是Tomcat启动的默认端口!

如果要修改默认端口呢?
在这里插入图片描述

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值