vlambda博客
学习文章列表

微服务框架【第1期】--SpringBoot基础

微服务框架【第1期】--SpringBoot基础

导读:

大家好,我是老田。从今天我们开始java微服务及分布式架构相关的内容,微服务分布式框架,主要介绍SpringBoot、SpringCloud和SpringCloudAlibaba。除此之外还会涉及到一些中间件的使用。今天我们先梳理SpringBoot框架的基础内容。

1.SpringBoot简介

Spring Boot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品:

这句话大体翻译就是以spring最少的配置就能轻松地构建独立的、生产级的、基于Spring的应用程序

Spring Boot 简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是启动器 starter),这样我们就可以简单的开始。多数Spring Boot应用只需要很少的Spring配置。


2.Spring Boot的特点

Spring Boot 主要特点是:

  1. 创建独立的Spring应用,为所有 Spring 的开发者提供一个非常快速的、广泛接受的入门体验

  2. 直接嵌入应用服务器,如tomcat、jetty、undertow等;不需要去部署war包

  3. 提供固定的启动器依赖去简化组件配置;实现开箱即用(启动器starter-其实就是Spring Boot提供的一个jar 包),通过自己设置参数(.properties或.yml的配置文件),即可快速使用。

  4. 自动地配置Spring和其它有需要的第三方依赖 提供了一些大型项目中常见的非功能性特性,如内嵌服务器、安全、指标,健康检测、外部化配置等

  5. 绝对没有代码生成,也无需 XML 配置

总而言之,SpringBoot是spring开源组织下的子项目,是spring组件一站式的解决方案,主要是简化了使用spring框架的难度,简省了繁琐的配置,并且提供一些强大的功能(各种启动器,自动配置,应用监控等),使开发者能快速上手。

3.springboot优缺点

  • 优点

    • 快速构建独立运行的spring项目以及与主流框架集成;

    • 使用嵌入式Servlet容器,项目无需打成war包;

    • starters自动依赖与版本控制;

    • 大量的自动配置,简化开发,也可修改默认值;

    • 无需配置xml,无代码生成,开箱即用;

    • 应用监控等

  • 缺点

    • 入门容易,但是精通难,因为springboot是基于spring框架的再封装,如果不了解spring框架底层实现,那么对springboot的封装机制就不是很了解springboot原理的话,就需要先了解spring框架的底层原理

4.SpringBoot版本

SpringBoot最新版本已经更新到了2.6.6。但是个人觉得没有必要升太快。另外SpringBoot2.5以后版本JDK最低要求是17。而很多技术人员还在使用JDK8.

微服务框架【第1期】--SpringBoot基础

  • GA:General Availability,正式发布的版本,官方推荐使用此版本。在国外都是用GA来说明release版本的。

  • PRE: 预览版,内部测试版. 主要是给开发人员和测试人员测试和找BUG用的,不建议使用;

  • SNAPSHOT: 快照版,可以稳定使用,且仍在继续改进版本。


5.创建SpringBoot工程方式

  1. 在线创建

    这是官方提供的一个创建方式,实际上,如果我们使用开发工具去创建 Spring Boot 项目的话(即第二种方式),也是从这个网站上创建的,只不过这个过程开发工具帮助我们完成了,我们只需要在开发工具中进行简单的配置即可。

    在线创建网址:

     https://start.spring.io/


  2. 使用开发工具创建

    上面的步骤太过于繁琐,也可以使用 IDE 来创建

    IntelliJ IDEA常见SpringBoot项目

    首先在创建项目的时候选择 Spring Initializr,如图:

    微服务框架【第1期】--SpringBoot基础

     spring官网连接:https://start.spring.io/
     阿里云连接:https://start.aliyun.com/  
     #强烈建议使用阿里云连接,使用官网连接我下载了2个半小时.....


  3. Maven 创建

    上面提到的两种方式,其实都借助了https://start.spring.io/这个网站使用 Maven 创建:首先创建一个普通的 Maven 项目

    创建完成之后,在 pom.xml 文件中,添加如下依赖:

     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.1.4.RELEASE</version>
     </parent>
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
     </dependencies>

    添加成功之后,再在 java 目录下创建包,包中创建一个名为 App 的启动类,

     @EnableAutoConfiguration
     @RestController
     public class App {
         public static void main(String[] args) {
             SpringApplication.run(App.class, args);
        }
         @GetMapping("/hello")
         public String hello() {
             return "hello";
        }
     }

    @EnableAutoConfiguration 注解表示开启自动化配置然后执行这里的 main 方法就可以启动一个 Spring Boot 工程了

6.SpringBoot如何实现依赖管理的(maven方式)

传统我们搭建SSM项目的时候,使用maven做jar依赖管理的时候,还需要我们配置依赖jar包相应的版本,并且构建项目的时候,是需要什么jar包 包,并未对jar进行系统的归结和管理。而springboot改变了这一现状,他相当于对maven依赖上进行更为全面的归结和管理。

前面说传统开发的问题之一就是依赖管理混乱,怎么这里我们还需要管理依赖呢?难道 Spring Boot不帮我们管理吗?别着急,现在我们的项目与Spring Boot还没有什么关联。Spring Boot提供了一个名为spring-boot-starter-parent 的工程,里面已经对各种常用依赖(并非全部)的版本进行了管理,我们的项目需要以这个项目为父工程,这样我们 就不用操心依赖的版本问题了,需要什么依赖,直接引入坐标即可!

官网中也说明了springboot依赖管理:

Each release of Spring Boot provides a curated list of dependencies that it supports. In practice, you do not need to provide a version these dependencies in your build configuration, as Spring Boot manages that for you. When you upgrade Spring Boot itself, these depend upgraded as well in a consistent way,The curated list contains all the spring modules that you can use with Spring Boot as well as a refin third party libraries.

上述解释是:每一个SpringBoot版本都提供了一个它所支持的依赖关系的管理列表。实际上,您不需要在构建配置中为这些依赖项中的任何一个提供管理,因为Spring引导会为您管理这个版本。当您升级Spring引导本身时,这些依赖项也会以一致的方式升级,管理列表包含所有可以与Spring引导一起使用 块,以及第三方库的优化列表。

当用maven来做项目依赖管理的时候,我们可以在pom.xml文件中看到如下配置:

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

它引入spring-boot-starter-parent父项目,咱们可以继续看spring-boot-starter-parent项目有哪些依赖,我们可以在idea工具中,使用ctrl可以 项目依赖pom文件中(点击spring-boot-starter-parent)

 <parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-dependencies</artifactId>
     <version>2.4.0</version>
 </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>
 <properties>
     <java.version>1.8</java.version>
     <resource.delimiter>@</resource.delimiter>
     <maven.compiler.source>${java.version}</maven.compiler.source>
     <maven.compiler.target>${java.version}</maven.compiler.target>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 </properties>

它是继续依赖spring-boot-dependencies这个项目,同样的方式进入到spring-boot-dependencies项目POM文件中,主要看properties属性和 dependencyManagement属性(因代码太长,因此下方只列出来了properties):

 <properties>
     <activemq.version>5.16.0</activemq.version>
     <antlr2.version>2.7.7</antlr2.version>
     <appengine-sdk.version>1.9.83</appengine-sdk.version>
     <artemis.version>2.15.0</artemis.version>
     <aspectj.version>1.9.6</aspectj.version>
     <assertj.version>3.18.1</assertj.version>
     <atomikos.version>4.0.6</atomikos.version>
     <awaitility.version>4.0.3</awaitility.version>
     <bitronix.version>2.1.4</bitronix.version>
     <build-helper-maven-plugin.version>3.2.0</build-helper-maven-plugin.version>
     <byte-buddy.version>1.10.18</byte-buddy.version>
     <caffeine.version>2.8.6</caffeine.version>
     <cassandra-driver.version>4.9.0</cassandra-driver.version>
     <classmate.version>1.5.1</classmate.version>
     <commons-codec.version>1.15</commons-codec.version>
     <commons-dbcp2.version>2.8.0</commons-dbcp2.version>
     <commons-lang3.version>3.11</commons-lang3.version>
     <commons-pool.version>1.6</commons-pool.version>
     <commons-pool2.version>2.9.0</commons-pool2.version>
     <couchbase-client.version>3.0.10</couchbase-client.version>
     <db2-jdbc.version>11.5.4.0</db2-jdbc.version>
     <dependency-management-plugin.version>1.0.10.RELEASE</dependency-management-plugin.version>
     <derby.version>10.14.2.0</derby.version>
     <dropwizard-metrics.version>4.1.14</dropwizard-metrics.version>
     <ehcache.version>2.10.6</ehcache.version>
     <ehcache3.version>3.9.0</ehcache3.version>
     <elasticsearch.version>7.9.3</elasticsearch.version>
     <embedded-mongo.version>2.2.0</embedded-mongo.version>
     <flyway.version>7.1.1</flyway.version>
     <freemarker.version>2.3.30</freemarker.version>
     <git-commit-id-plugin.version>3.0.1</git-commit-id-plugin.version>
     <glassfish-el.version>3.0.3</glassfish-el.version>
     <glassfish-jaxb.version>2.3.3</glassfish-jaxb.version>
     <groovy.version>2.5.13</groovy.version>
     <gson.version>2.8.6</gson.version>
     <h2.version>1.4.200</h2.version>
     <hamcrest.version>2.2</hamcrest.version>
     <hazelcast.version>4.0.3</hazelcast.version>
     <hazelcast-hibernate5.version>2.1.1</hazelcast-hibernate5.version>
     <hibernate.version>5.4.23.Final</hibernate.version>
     <hibernate-validator.version>6.1.6.Final</hibernate-validator.version>
     <hikaricp.version>3.4.5</hikaricp.version>
     <hsqldb.version>2.5.1</hsqldb.version>
     <htmlunit.version>2.44.0</htmlunit.version>
     <httpasyncclient.version>4.1.4</httpasyncclient.version>
     <httpclient.version>4.5.13</httpclient.version>
     <httpcore.version>4.4.13</httpcore.version>
     <infinispan.version>11.0.5.Final</infinispan.version>
     <influxdb-java.version>2.20</influxdb-java.version>
     <jackson-bom.version>2.11.3</jackson-bom.version>
     <jakarta-activation.version>1.2.2</jakarta-activation.version>
     <jakarta-annotation.version>1.3.5</jakarta-annotation.version>
     <jakarta-jms.version>2.0.3</jakarta-jms.version>
     <jakarta-json.version>1.1.6</jakarta-json.version>
     <jakarta-json-bind.version>1.0.2</jakarta-json-bind.version>
     <jakarta-mail.version>1.6.5</jakarta-mail.version>
     <jakarta-persistence.version>2.2.3</jakarta-persistence.version>
     <jakarta-servlet.version>4.0.4</jakarta-servlet.version>
     <jakarta-servlet-jsp-jstl.version>1.2.7</jakarta-servlet-jsp-jstl.version>
     <jakarta-transaction.version>1.3.3</jakarta-transaction.version>
     <jakarta-validation.version>2.0.2</jakarta-validation.version>
     <jakarta-websocket.version>1.1.2</jakarta-websocket.version>
     <jakarta-ws-rs.version>2.1.6</jakarta-ws-rs.version>
     <jakarta-xml-bind.version>2.3.3</jakarta-xml-bind.version>
     <jakarta-xml-soap.version>1.4.2</jakarta-xml-soap.version>
     <jakarta-xml-ws.version>2.3.3</jakarta-xml-ws.version>
     <janino.version>3.1.2</janino.version>
     <javax-activation.version>1.2.0</javax-activation.version>
     <javax-annotation.version>1.3.2</javax-annotation.version>
     <javax-cache.version>1.1.1</javax-cache.version>
     <javax-jaxb.version>2.3.1</javax-jaxb.version>
     <javax-jaxws.version>2.3.1</javax-jaxws.version>
     <javax-jms.version>2.0.1</javax-jms.version>
     <javax-json.version>1.1.4</javax-json.version>
     <javax-jsonb.version>1.0</javax-jsonb.version>
     <javax-mail.version>1.6.2</javax-mail.version>
     <javax-money.version>1.1</javax-money.version>
     <javax-persistence.version>2.2</javax-persistence.version>
     <javax-transaction.version>1.3</javax-transaction.version>
     <javax-validation.version>2.0.1.Final</javax-validation.version>
     <javax-websocket.version>1.1</javax-websocket.version>
     <jaxen.version>1.2.0</jaxen.version>
     <jaybird.version>3.0.9</jaybird.version>
     <jboss-logging.version>3.4.1.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>3.3.0</jedis.version>
     <jersey.version>2.32</jersey.version>
     <jetty-el.version>8.5.54</jetty-el.version>
     <jetty-jsp.version>2.2.0.v201112011158</jetty-jsp.version>
     <jetty-reactive-httpclient.version>1.1.4</jetty-reactive-httpclient.version>
     <jetty.version>9.4.34.v20201102</jetty.version>
     <jmustache.version>1.15</jmustache.version>
     <johnzon.version>1.2.8</johnzon.version>
     <jolokia.version>1.6.2</jolokia.version>
     <jooq.version>3.14.3</jooq.version>
     <json-path.version>2.4.0</json-path.version>
     <json-smart.version>2.3</json-smart.version>
     <jsonassert.version>1.5.0</jsonassert.version>
     <jstl.version>1.2</jstl.version>
     <jtds.version>1.3.1</jtds.version>
     <junit.version>4.13.1</junit.version>
     <junit-jupiter.version>5.7.0</junit-jupiter.version>
     <kafka.version>2.6.0</kafka.version>
     <kotlin.version>1.4.10</kotlin.version>
     <kotlin-coroutines.version>1.4.1</kotlin-coroutines.version>
     <lettuce.version>6.0.1.RELEASE</lettuce.version>
     <liquibase.version>3.10.3</liquibase.version>
     <log4j2.version>2.13.3</log4j2.version>
     <logback.version>1.2.3</logback.version>
     <lombok.version>1.18.16</lombok.version>
     <mariadb.version>2.7.0</mariadb.version>
     <maven-antrun-plugin.version>1.8</maven-antrun-plugin.version>
     <maven-assembly-plugin.version>3.3.0</maven-assembly-plugin.version>
     <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
     <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
     <maven-dependency-plugin.version>3.1.2</maven-dependency-plugin.version>
     <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
     <maven-enforcer-plugin.version>3.0.0-M3</maven-enforcer-plugin.version>
     <maven-failsafe-plugin.version>2.22.2</maven-failsafe-plugin.version>
     <maven-help-plugin.version>3.2.0</maven-help-plugin.version>
     <maven-install-plugin.version>2.5.2</maven-install-plugin.version>
     <maven-invoker-plugin.version>3.2.1</maven-invoker-plugin.version>
     <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
     <maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version>
     <maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
     <maven-shade-plugin.version>3.2.4</maven-shade-plugin.version>
     <maven-source-plugin.version>3.2.1</maven-source-plugin.version>
     <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
     <maven-war-plugin.version>3.3.1</maven-war-plugin.version>
     <micrometer.version>1.6.1</micrometer.version>
     <mimepull.version>1.9.13</mimepull.version>
     <mockito.version>3.6.0</mockito.version>
     <mongodb.version>4.1.1</mongodb.version>
     <mssql-jdbc.version>8.4.1.jre8</mssql-jdbc.version>
     <mysql.version>8.0.22</mysql.version>
     <nekohtml.version>1.9.22</nekohtml.version>
     <neo4j-java-driver.version>4.1.1</neo4j-java-driver.version>
     <netty.version>4.1.54.Final</netty.version>
     <netty-tcnative.version>2.0.34.Final</netty-tcnative.version>
     <oauth2-oidc-sdk.version>8.23.1</oauth2-oidc-sdk.version>
     <nimbus-jose-jwt.version>9.1.2</nimbus-jose-jwt.version>
     <ojdbc.version>19.3.0.0</ojdbc.version>
     <okhttp3.version>3.14.9</okhttp3.version>
     <oracle-database.version>19.8.0.0</oracle-database.version>
     <pooled-jms.version>1.2.1</pooled-jms.version>
     <postgresql.version>42.2.18</postgresql.version>
     <prometheus-pushgateway.version>0.9.0</prometheus-pushgateway.version>
     <quartz.version>2.3.2</quartz.version>
     <querydsl.version>4.4.0</querydsl.version>
     <r2dbc-bom.version>Arabba-SR8</r2dbc-bom.version>
     <rabbit-amqp-client.version>5.10.0</rabbit-amqp-client.version>
     <reactive-streams.version>1.0.3</reactive-streams.version>
     <reactor-bom.version>2020.0.1</reactor-bom.version>
     <rest-assured.version>3.3.0</rest-assured.version>
     <rsocket.version>1.1.0</rsocket.version>
     <rxjava.version>1.3.8</rxjava.version>
     <rxjava-adapter.version>1.2.1</rxjava-adapter.version>
     <rxjava2.version>2.2.20</rxjava2.version>
     <saaj-impl.version>1.5.2</saaj-impl.version>
     <selenium.version>3.141.59</selenium.version>
     <selenium-htmlunit.version>2.44.0</selenium-htmlunit.version>
     <sendgrid.version>4.6.8</sendgrid.version>
     <servlet-api.version>4.0.1</servlet-api.version>
     <slf4j.version>1.7.30</slf4j.version>
     <snakeyaml.version>1.27</snakeyaml.version>
     <solr.version>8.5.2</solr.version>
     <spring-amqp.version>2.3.1</spring-amqp.version>
     <spring-batch.version>4.3.0</spring-batch.version>
     <spring-data-bom.version>2020.0.1</spring-data-bom.version>
     <spring-framework.version>5.3.1</spring-framework.version>
     <spring-hateoas.version>1.2.1</spring-hateoas.version>
     <spring-integration.version>5.4.1</spring-integration.version>
     <spring-kafka.version>2.6.3</spring-kafka.version>
     <spring-ldap.version>2.3.3.RELEASE</spring-ldap.version>
     <spring-restdocs.version>2.0.5.RELEASE</spring-restdocs.version>
     <spring-retry.version>1.3.0</spring-retry.version>
     <spring-security.version>5.4.1</spring-security.version>
     <spring-session-bom.version>2020.0.1</spring-session-bom.version>
     <spring-ws.version>3.0.10.RELEASE</spring-ws.version>
     <sqlite-jdbc.version>3.32.3.2</sqlite-jdbc.version>
     <sun-mail.version>1.6.5</sun-mail.version>
     <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
     <thymeleaf-extras-data-attribute.version>2.0.1</thymeleaf-extras-data-attribute.version>
     <thymeleaf-extras-java8time.version>3.0.4.RELEASE</thymeleaf-extras-java8time.version>
     <thymeleaf-extras-springsecurity.version>3.0.4.RELEASE</thymeleaf-extras-springsecurity.version>
     <thymeleaf-layout-dialect.version>2.5.1</thymeleaf-layout-dialect.version>
     <tomcat.version>9.0.39</tomcat.version>
     <unboundid-ldapsdk.version>4.0.14</unboundid-ldapsdk.version>
     <undertow.version>2.2.2.Final</undertow.version>
     <versions-maven-plugin.version>2.8.1</versions-maven-plugin.version>
     <webjars-hal-browser.version>3325375</webjars-hal-browser.version>
     <webjars-locator-core.version>0.46</webjars-locator-core.version>
     <wsdl4j.version>1.6.3</wsdl4j.version>
     <xml-maven-plugin.version>1.0.2</xml-maven-plugin.version>
     <xmlunit2.version>2.7.0</xmlunit2.version>
 </properties>

从POM文件中可以看到spring-boot-dependencies项目的POM文件才是真正管理springboot项目依赖的。他相当于jar包的依赖仲裁,他提供了管理,以及spring框架和其他第三方组件jar包的依赖管理。

7.SpringBoot项目引入spring-boot-starter-parent的两种方式

使用这种依赖管理包括两种方式:

1.(默认方式)继承Spring Boot的提供的父工程,需要在pom.xml中配置,如下

微服务框架【第1期】--SpringBoot基础

2.通过scope=import的方式引入, 在很多时候我们需要继承自有的父工程或由于其他设置无法使用Spring Boot提供的父工程。此时可以通过scope的方式进行引入,如下

微服务框架【第1期】--SpringBoot基础

此处通过scope=import的方式导入了依赖的管理配置。但此时我们无法通过在properties中覆盖对应的属性来完成version的控制(因为没有继承 此应对的方式是通过在dependencyManagement中进行配置,并且要求在spring-boot-dependencies之前添加即可。同时,对应spring-boot-maven插件也需要显式配置才可以。

微服务框架【第1期】--SpringBoot基础


8.入口类和@SpringBootApplication

自动配置是springboot的一大特性,它能在我们添加相应的jar包依赖的时候,自动为我们配置了这些组件的相关配置,我们无需配置或者只需要少量的配置就能运行我 们编写的项目。官网也对自动配置作了详细说明:

Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. For example, if HSQLDB is on your classpath, and you have not manually configured any database connection beans, then Spring Boot auto-configures an inmemory database.

上述语句翻译为中文为:SpringBoot自动配置尝试根据您添加的JAR依赖性自动配置您的Spring应用程序。例如,如果HSQLDB在您的类路径上,并且您没有手动配置 任何数据库连接bean,那么spring boot会自动配置内存中的数据库。

如果需要设置自动配置的话,方法是将@EnableAutoconfiguration注解添加到您的@configuration类中

要研究springboot的自动配置需要从主程序类开始入手,请看下面代码:

 package com.tian.springbootdemo01;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 public class SpringbootDemo01Application {
 
     public static void main(String[] args) {
         
         SpringApplication.run(SpringbootDemo01Application.class, args);
    }
 
 }
 


这就是主程序类,这个类最主要的部分是@SpringBootApplication,正是通过添加了这个注解, springboot应用才能正常启动

  1. @SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解:

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

    这个注解最主要部分是:

    1.@SpringBootConfiguration:这个注解标注在某类上,说明这个类是一个springboot配置类

    2.@EnableAutoConfiguration:这个注解就是springboot能实现自动配置的关键

    3.@ComponentScan:这个注解是组件扫描这个是我们最熟悉的注解,即使没有使用过注解也经常在spring的配置文件中使用过<context:component-scan base-package="com.xxx.xxx"/>, 组件扫描就是扫描指定的包下的类,并加载符合条件的组件


  2. @EnableAutoConfiguration注解:

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

    可以发现它也是一个组合注解,Spring 中有很多以Enable开头的注解,其作用就是借助@Import来收集并注册特定场景相关的bean,并加载到IoC容器@EnableAutoConfiguration就是借助@Import来收集所有符合自动配置条件的bean定义,并加载到IoC容器

    里面最主要注解是:

    @AutoConfigurationPackage:自动配置包,它也是一个组合注解,其中最重要的注解是@Import(AutoConfigurationPackages.Registrar.class),它是spring框 架的底层注解,它的作用就是给容器中导入某个组件类,例如@Import(AutoConfigurationPackages.Registrar.class),它就是将Registrar这个组件类导入到容器 中,可查看Registrar类中registerBeanDefinitions方法,这个方法就是导入组件类的具体实现。

     static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {  
         @Override  
         public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {  
             // 将注解标注的元信息传入,获取到相应的包名    
             register(registry, new PackageImport(metadata).getPackageName());  
        }  
     
         @Override  
         public Set<Object> determineImports(AnnotationMetadata metadata) {  
             return Collections.singleton(new PackageImport(metadata));  
        }  
     }

    @AutoConfigurationPackage注解就是将主程序类所在包及所有子包下的组件到扫描到spring容器中

    @Import({AutoConfigurationImportSelector.class}):将AutoConfigurationImportSelector这个类导入到spring容器中, AutoConfigurationImportSelector可以帮助springboot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器 (ApplicationContext)中。

  3. AutoConfigurationImportSelector类,通过源码分析这个类中是通过selectImports这个方法告诉springboot都需要导入那些组件:

     public Iterable<Entry> selectImports() {
         if (this.autoConfigurationEntries.isEmpty()) {
             return Collections.emptyList();
        } else {
             Set<String> allExclusions = (Set)this.autoConfigurationEntries.stream().map(AutoConfigurationImportSelector.AutoConfigurationEntry::getExclusions).flatMap(Collection::stream).collect(Collectors.toSet());
             Set<String> processedConfigurations = (Set)this.autoConfigurationEntries.stream().map(AutoConfigurationImportSelector.AutoConfigurationEntry::getConfigurations).flatMap(Collection::stream).collect(Collectors.toCollection(LinkedHashSet::new));
             processedConfigurations.removeAll(allExclusions);
             return (Iterable)this.sortAutoConfigurations(processedConfigurations, this.getAutoConfigurationMetadata()).stream().map((importClassName) -> {
                 return new Entry((AnnotationMetadata)this.entries.get(importClassName), importClassName);
            }).collect(Collectors.toList());
        }
     }


9.SpringBoot场景启动器--Starter

Spring Boot 将日常企业应用研发中的各种场景都抽取出来,做成一个个的 starter(启动器),starter 中整合了该场景下各种可能用到的依赖,用户只需要在 Maven 中引入 starter 依赖,SpringBoot 就能自动扫描到要加载的信息并启动相应的默认配置。starter 提供了大量的自动配置,让用户摆脱了处理各种依赖和配置的困扰。所有这些 starter 都遵循着约定成俗的默认配置,并允许用户调整这些配置,即遵循“约定大于配置”的原则。

并不是所有的 starter 都是由 Spring Boot 官方提供的,也有部分 starter 是第三方技术厂商提供的,例如 druid-spring-boot-starter 和 mybatis-spring-boot-starter 等等。当然也存在个别第三方技术,Spring Boot 官方没提供 starter,第三方技术厂商也没有提供 starter。

场景启动器示例:

名称 描述
spring-boot-starter-thymeleaf 使MVC Web applications 支持Thymeleaf
spring-boot-starter-data-couchbase 使用Couchbase 文件存储数据库、Spring Data Couchbase
spring-boot-starter-artemis 为JMS messaging使用Apache Artemis
spring-boot-starter-web-services 使用Spring Web Services
spring-boot-starter-mail Java Mail、Spring email为邮件发送工具
spring-boot-starter-data-redis 通过Spring Data Redis 、Jedis client使用Redis键值存储数据库
spring-boot-starter-web 构建Web,包含RESTful风格框架SpringMVC和默认的嵌入式容器Tomcat
spring-boot-starter-activemq 为JMS使用Apache ActiveMQ
spring-boot-starter-data-elasticsearch 使用Elasticsearch、analytics engine、Spring Data Elasticsearch
spring-boot-starter-integration 使用Spring Integration
spring-boot-starter-test 测试 Spring Boot applications包含JUnit、 Hamcrest、Mockito
spring-boot-starter-jdbc 通过 Tomcat JDBC 连接池使用JDBC
spring-boot-starter-mobile 通过Spring Mobile构建Web应用
spring-boot-starter-validation 通过Hibernate Validator使用 Java Bean Validation
spring-boot-starter-hateoas 使用Spring MVC、Spring HATEOAS构建 hypermedia-based RESTful Web 应用
spring-boot-starter-jersey 通过 JAX-RS、Jersey构建 RESTful web applications;spring-boot-starter-web的另一替代方案
spring-boot-starter-data-neo4j 使用Neo4j图形数据库、Spring Data Neo4j
spring-boot-starter-websocket 使用Spring WebSocket构建 WebSocket 应用
spring-boot-starter-aop 通过Spring AOP、AspectJ面向切面编程
spring-boot-starter-amqp 使用Spring AMQP、Rabbit MQ
spring-boot-starter-data-cassandra 使用Cassandra分布式数据库、Spring Data Cassandra
spring-boot-starter-social-facebook 使用 Spring Social Facebook
spring-boot-starter-jta-atomikos 为 JTA 使用 Atomikos
spring-boot-starter-security 使用 Spring Security
spring-boot-starter-mustache 使MVC Web applications 支持Mustache
spring-boot-starter-data-jpa 通过 Hibernate 使用 Spring Data JPA (Spring-data-jpa依赖于Hibernate)
spring-boot-starter Core starter,包括 自动配置支持、 logging and YAML
spring-boot-starter-groovy-templates 使MVC Web applications 支持Groovy Templates
spring-boot-starter-freemarker 使MVC Web applications 支持 FreeMarker
spring-boot-starter-batch 使用Spring Batch
spring-boot-starter-social-linkedin 使用Spring Social LinkedIn
spring-boot-starter-cache 使用 Spring caching 支持
spring-boot-starter-data-solr 通过 Spring Data Solr 使用 Apache Solr
spring-boot-starter-data-mongodb 使用 MongoDB 文件存储数据库、Spring Data MongoDB
spring-boot-starter-jooq 使用JOOQ链接SQL数据库;spring-boot-starter-data-jpa、spring-boot-starter-jdbc的另一替代方案
spring-boot-starter-jta-narayana Spring Boot Narayana JTA Starter
spring-boot-starter-cloud-connectors 用连接简化的 Spring Cloud 连接器进行云服务就像Cloud Foundry、Heroku那样
spring-boot-starter-jta-bitronix 为JTA transactions 使用 Bitronix
spring-boot-starter-social-twitter 使用 Spring Social Twitter
spring-boot-starter-data-rest 使用Spring Data REST 以 REST 方式暴露 Spring Data repositories
spring-boot-starter-actuator 使用Spring Boot Actuator 的 production-ready 功能来帮助你监视和管理应用
spring-boot-starter-undertow 使用 Undertow 作为嵌入式服务容器;spring-boot-starter-tomcat的另一替代方案
spring-boot-starter-jetty 使用 Jetty 作为嵌入式服务容器;spring-boot-starter-tomcat的另一替代方案
spring-boot-starter-logging 为 logging 使用Logback.默认 logging starter
spring-boot-starter-tomcat 使用 Tomcat 作为嵌入式服务容器;作为默认嵌入式服务容器被spring-boot-starter-web使用
spring-boot-starter-log4j2 使用Log4j2记录日志;spring-boot-starter-logging的另一替代方案



博观而约取,厚积而薄发!


--END--