Skip to content

《面渣逆袭》Spring 篇 · 第 6/7 章。原版 PDF(下载 / 打印)

31.介绍一下 SpringBoot,有哪些优点?

SpringBoot 基于 Spring 开发,SpirngBoot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。

配图

SpringBoot 以约定大于配置核心思想开展工作,相比 Spring 具有如下优势:

  1. SpringBoot 可以快速创建独立的 Spring 应用程序。

  2. SpringBoot 内嵌了如 Tomcat ,Jetty 和 Undertow 这样的容器,也就是说可以直接跑起来,

用不着再做部署工作了。

  1. SpringBoot 无需再像 Spring 一样使用一堆繁琐的 xml 文件配置。
4.Spring Boot 可以自动配置(核心)Spring。SpringBoot 将原有的 XML 配置改为 Java 配置,将
bean 注入改为使用注解注入的方式(@Autowire),并将多个 xml、properties 配置浓缩在一个

appliaction.yml 配置文件中。

  1. SpringBoot 提供了一些现有的功能,如量度工具,表单数据验证以及一些外部配置这样的一些

第三方功能。

  1. SpringBoot 可以快速整合常用依赖(开发库,例如 spring-webmvc 、jackson-json 、

validation-api 和 tomcat 等),提供的 POM 可以简化 Maven 的配置。当我们引入核心依赖时,SpringBoot 会自引入其他依赖。

32.SpringBoot 自动配置原理了解吗?

SpringBoot 开启自动配置的注解是**@ EnableAutoConfiguration**,启动类上的注解

@ SpringBootApplication是一个复合注解,包含了@ EnableAutoConfiguration :

配图

EnableAutoConfiguration只是一个简单的注解,自动装配核心功能的实现实际是通过

AutoConfigurationImportSelector

@ AutoConfigurationPackage// 将main 同级的包下的所有组件注册到容器中

@Import({AutoConfigurationImportSelector.class}) //加载自动装配类

xxxAutoconfiguration

java
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    Class<?>[] exclude() default {};
    String[] excludeName() default {};
}

AutoConfigurationImportSelector实现了ImportSelector交叉,这个交叉的作用就是收集需要导入的配置类,配合**@ Import( )**就可以将相应的类导入到 Spring 容器中

获取注入类的方法是 selectImports(),它实际调用的是getAutoConfigurationEntry ,这个方

法是获取自动装配类的关键,主要流程可以分为这么几步:

  1. 获取注解的属性,用于后面的排除

  2. 获取所有需要自动装配的配置类的路径:这一步是最关键的,从 META-

INF/spring.factories 获取自动配置类的路径

  1. 去掉重复的配置类和需要排除的重复类,把需要自动加载的配置类的路径存储起来
    protected AutoConfigurationImportSelector.AutoConfigurationEntry
getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            //1.获取到注解的属性
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            //2.获取需要自动装配的所有配置类,读取META-INF/spring.factories,获取自动配置类路

List<String>configurations=this.getCandidateConfigurations(annotationMetadata,

attributes);
            //3.1.移除重复的配置
            configurations = this.removeDuplicates(configurations);
            //3.2.处理需要排除的配置
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.getConfigurationClassFilter().filter(configurations);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new
AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }

33.如何自定义一个 SpringBoot Srarter?

知道了自动配置原理,创建一个自定义 SpringBootStarter 也很简单。

  1. 创建一个项目,命名为 demo-spring-boot-starter ,引入 SpringBoot 相关依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>

  1. 编写配置文件

这里定义了属性配置的前缀

java
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
    private String name;
    //省略getter、setter
}
  1. 自动装配

创建自动配置类 HelloPropertiesConfigure

@ Configuration

java
@EnableConfigurationProperties(HelloProperties.class)
public class HelloPropertiesConfigure {
}
  1. 配置自动类

在**/resources/META-INF/spring.factories**文件中添加自动配置类路径

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

cn.fighter3.demo.starter.configure.HelloPropertiesConfigure

  1. 测试

创建一个工程,引入自定义 starter 依赖<dependency><groupId>cn.fighter3</groupId><artifactId>demo-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version></dependency>在配置文件里添加配置

hello.name= 张三测试类

@RunWith(SpringRunner.class)

@ SpringBootTest

java
public class HelloTest {

@ Autowired

    HelloProperties helloProperties;

@ Test

java
    public void hello(){
        System.out.println("你好,"+helloProperties.getName());
    }
}

运行结果

配图

至此,随手写的一个自定义 SpringBoot-Starter 就完成了,虽然比较简单,但是完成了主要的自动装配的能力。

34.Springboot 启动原理?

SpringApplication 这个类主要做了以下四件事情:

  1. 推断应用的类型是普通的项目还是 We b 项目

  2. 查找并加载所有可用初始化器 , 设置到 initializers 属性中

  3. 找出所有的应用程序监听器,设置到 listeners 属性中

  4. 推断并设置 main 方法的定义类,找到运行的主类

SpringBoot 启动大致流程如下 :

配图

本文整理自三分恶《面渣逆袭》系列的公开内容,仅供个人学习使用

本站仅供个人学习使用,请勿外传