• SpringBoot入门详解


    目录

    因何而生的SpringBoot

    单体架构的捉襟见肘

    SpringBoot的优点

    快速入门

    高曝光率的Annotation

    SpringBoot的工作机制

    了解@SpringBootApplication

    @SpringBootConfiguration

    @EnableAutoConfiguration

    自动配置的幕后英雄:SpringFactoriesLoader

    @ComponentScan

    SpringApplication执行流程

    SpringApplicationRunListener

    ApplicationContextInitializer

    ApplicationListener

    CommandLineRunner


    因何而生的SpringBoot

    单体架构的捉襟见肘

    微服务架构和Spring Boot框架的出现是为了解决传统单体应用程序在开发、部署和维护方面遇到的一系列问题,包括:

    1. 复杂性管理: 传统的单体应用程序通常变得非常庞大和复杂,开发和维护成本逐渐增加。微服务架构将应用程序拆分成小的、独立的服务,每个服务负责特定的业务功能。这简化了应用的开发、测试和维护。

    2. 技术多样性: 单体应用程序通常使用单一的技术栈,而微服务允许每个服务选择适合其需求的技术栈。这使得开发者可以更好地选择适合任务的工具和技术。

    3. 快速交付: 微服务允许不同的团队独立开发、测试和部署服务,从而提高了交付速度。这有助于敏捷开发和持续交付。

    4. 可伸缩性: 微服务使得应用程序的各个部分可以根据需求独立地扩展,而不是整个应用程序。这提高了应用程序的可伸缩性,能够应对高流量和负载。

    5. 容错性: 微服务的分布性使得应用程序更容易实现容错和恢复能力。当某个服务失败时,不会影响整个应用程序。

    6. 部署灵活性: 微服务可以独立部署,这意味着你可以频繁地更新和部署单个服务,而不必影响整个应用程序。

    Spring Boot的出现与微服务架构有关,它是Spring Framework的一部分,旨在简化开发独立的、可执行的Java应用程序。Spring Boot解决了传统Java应用程序开发中的繁琐配置问题,使开发人员能够更快速地构建微服务和独立应用程序。

    SpringBoot的优点

    Spring Boot是一个用于构建生产级Spring应用程序的框架,它具有许多优点,使得它成为Java应用程序开发的首选框架之一:

    1. 简化开发: Spring Boot通过自动配置和约定大于配置的原则,简化了应用程序的开发和配置。开发者可以快速启动项目,减少了大量的样板代码编写。

    2. 内嵌容器: Spring Boot支持内嵌的Web容器(如Tomcat、Jetty、Undertow),这意味着你无需手动部署WAR文件到独立的Servlet容器中,而是将应用程序打包成一个可执行的JAR文件,直接运行。

    3. 自动配置: Spring Boot根据你的项目的依赖和设置,自动配置应用程序的各个组件,包括数据源、Spring MVC、安全等。这减少了繁琐的配置工作。

    4. 开发工具: Spring Boot提供了许多开发者友好的工具,如Spring Boot DevTools,它可以自动重启应用程序、热部署等,大大提高了开发效率。

    5. 生产就绪: Spring Boot提供了一组用于监控、度量、健康检查、日志记录和安全的功能,使应用程序更容易部署和运行在生产环境中。

    6. 微服务支持: Spring Boot与Spring Cloud集成良好,支持构建微服务架构。它提供了RESTful服务的构建和调用、服务注册与发现、负载均衡等功能。

    7. 生态系统: Spring Boot建立在Spring框架的基础上,继承了Spring的强大生态系统,包括Spring Security、Spring Data、Spring Integration等。你可以轻松整合这些组件。

    8. 广泛的第三方库支持: Spring Boot支持许多第三方库和插件,包括Thymeleaf、Freemarker、Swagger、Spring Boot Actuator等,帮助你快速构建各种类型的应用。

    9. 可扩展性: Spring Boot是高度可定制和可扩展的,允许你根据项目需求进行自定义配置和功能扩展。

    10. 大量文档和社区支持: Spring Boot拥有丰富的官方文档和庞大的开发者社区,可以轻松找到答案和解决问题。

    快速入门

    如果要快速入门,这个传送门一定很有帮助------->Spring | Quickstart

    高曝光率的Annotation
    1. @Configuration

      用于标识一个类作为配置类。配置类通常用于定义 Spring 容器的配置信息,包括 bean 的定义、依赖注入、AOP 配置等。使用 @Configuration 注解的类可以替代传统的 XML 配置文件,使配置更加可维护和类型安全。

    2. @ComponentScan

      对应XML配置形式中的元素,用于配合一些元信息Java Annotation,比如@Component和@Repository等,将标注了这些元信息Annotation的bean定义类批量采集到Spring的IoC容器中。

      不指定basePackages属性的时候,默认从声明@ComponentScan所在类的package扫描。

    3. @PropertySource和@PropertySources

      @PropertySource用于从某些地方加载*.properties文件内容。@PropertySources用于java8以下版本

      @Configuration
      @PropertySource{*classpath:1.properties}
      @PropertySource{*classpath:2.properties}
      public class XConfiguration {
          ...
      }

      属性的覆盖和优先级取决于加载的顺序,通常有以下规则:

      1. 属性值加载的顺序:

        • 默认属性值:Spring 提供了一些默认属性,如 spring.datasource.url,这些属性在 Spring 启动时被加载。

        • 属性文件:使用 @PropertySource 注解加载的属性文件。

        • XML 配置文件:通过 XML 配置文件(如 applicationContext.xml)中的 来加载属性文件。

        • 命令行参数和环境变量:命令行参数和环境变量可以覆盖已加载的属性值。

        • Java 系统属性:使用 System.setProperty() 来设置属性。

      2. 属性的优先级:

        • 当多个属性源中存在相同的属性时,后加载的属性会覆盖先加载的属性。

        • 属性的优先级从高到低为:命令行参数和环境变量 > XML 配置文件 > 属性文件 > 默认属性值。

    4. @Import与@ImportResource

      @Import:

      • @Import 注解用于导入其他配置类(@Configuration 注解标记的类)。

      • 可以在一个配置类中使用 @Import 注解导入多个其他配置类,以将它们组合在一起。

      @Configuration
      @Import({AppConfig1.class, AppConfig2.class})
      public class MainConfig {
          // ...
      }

      @ImportResource

      • @ImportResource 注解用于导入 XML 配置文件,通常是传统的 Spring XML 配置文件。

      • 通过 @ImportResource 注解,可以将一个或多个 XML 配置文件导入到 Spring 的注解配置中。

      @Configuration
      @ImportResource("classpath:applicationContext.xml")
      public class MainConfig {
          // ...
      }

    SpringBoot的工作机制

    SoringBoot是Spring框架对“约定优先于配置(Convention Over Configuration)”理念的最佳实践的产物。

    了解@SpringBootApplication

    从SpringBoot的quickStart教程中,看到SpringBoot启动类就只有以下几行:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    ​
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

    而其中的@SpringBootApplication和SpringApplication.run()两位就是重点关注对象了。

    @SpringBootApplication实际上是一个符合Annotation,主要是下面这三位:

    • @SpringBootConfiguration

    • @EnableAutoConfiguration

    • @ComponentScan

    而为了图方便,就把这3个Annotation合成了一个@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 {
        ...
    }
    @SpringBootConfiguration

    启动类标注了@Configuration注解,本质上就是一个IoC容器的配置类。

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    @Indexed
    public @interface SpringBootConfiguration {
        ...
    }
    @EnableAutoConfiguration

    按照Spring的套路,@EnableXXXXX的Annotation都是借助@Import的支持干大事,@EnableAutoConfiguration干的就是借助@Import将所有符合自动配置条件的bean定义加载到IoC容器。

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

    其中最关键的就是@Import({AutoConfigurationImportSelector.class}),借助AutoConfigurationImportSelector,@EnableAutoConfiguration可以将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。而在Spring框架中SpringFactoriesLoader的支持下,@EnableAutoConfiguration可以“智能”地自动配置。

    自动配置的幕后英雄:SpringFactoriesLoader

    SpringFactoriesLoader 是 Spring Framework 中的一个工具类,它用于加载和管理以工厂方式提供的实现。它的主要作用是在 Spring 扩展机制、自动配置以及服务发现等场景中方便地加载和实例化实现类。通常,它是通过读取 META-INF/spring.factories 文件来完成这些任务的。

    spring.factories是典型的java properties文件,配置的格式为key=value,注意key和value都是Java类型的完整类型,比如:

    org.springframework.context.ApplicationContextInitializer=\
    com.elaine.config.MyApplicationContextInitializer

    这样一来,@EnableAutoConfiguration自动配置的就变成了:

    从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。

    @ComponentScan

    @ComponentScan的功能是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。如果当前SpringBoot不需要加载bean定义的化,也可以不要@ComponentScan。

    SpringApplication执行流程
    1. 在使用SpringApplication的静态run方法之前,我们需要创建一个SpringApplication对象。在SpringApplication实例初始化的时候,它会提前做好几件事:

      • 根据classpath里面是否存在特征类(org.springframework.web.context.ConfigurableWebApplicationContext)决定是创建一个Web应用使用的ApplicationContext类型,还是创建一个标准的Standalone应用使用的ApplicationContext类型。

      • 使用SpringFactoriesLoader在classpath中查找并加载所有可用的ApplicationContextInitializer。

      • 使用SpringFactoriesLoader在classpath中查找并加载所有可用的ApplicationListener。

      • 推断并设置main方法的定义类。

    2. 实例初始化完成且设置完成,执行run方法,遍历执行所有通过SpringFactoriesLoader可以找到并加载的SpringApplicationRunListener,调用它们的started()方法。

    3. 创建并配置SpringBoot应用将要使用的Environment(包括配置要是用的PropertySource和Profile)。

    4. 遍历所用的SpringApplicationRunListener的environmentPrepared()。

    5. SpringApplication打印banner(如果showBanner属性被设置为true)。

    6. 根据用户的个性化设置决定是否需要使用自定义的配置,最重要的,将之前准备好的environment配置给ApplicationContext使用。

    7. ApplicationContext创建完成,SpringApplication再次使用SpringFactoriesLoader,查找加载所用可用的ApplicationContextInitializer,遍历调用它们的initialize(applicationContext)方法对已经创建好的ApplicationContext进一步处理。

    8. 遍历所用的SpringApplicationRunListener的contextPrepared()方法。

    9. 最核心的一步,将@EnableAutoConfiguration获取的所用配置和其他形式的IoC配置加载到已经准备完毕的ApplicationContext。

    10. 遍历所用的SpringApplicationRunListener的contextLoaded()方法。

    11. 调用ApplicationContext的refresh()方法。

    12. 查找ApplicationContext中是否注册有CommandLineRunner,有则遍历执行它们。

    13. 遍历执行SpringApplicationRunListener的finished()方法。

    整个过程中充斥着各种扩展点进行推进工作,我们有必要进一步分析下。

    SpringApplicationRunListener

    SpringApplicationRunListener是整个启动流程中接收不同执行点事件通知的监听者:

    public interface SpringApplicationRunListener {
         //刚执行run方法时
        void started();
         //环境建立好时候
        void environmentPrepared(ConfigurableEnvironment environment);
         //上下文建立好的时候
        void contextPrepared(ConfigurableApplicationContext context);
        //上下文载入配置时候
        void contextLoaded(ConfigurableApplicationContext context);
        //上下文刷新完成后,run方法执行完之前
        void finished(ConfigurableApplicationContext context, Throwable exception);
    }
    ApplicationContextInitializer
    • SpringApplication 提供了 addInitializers 方法,可以用于注册一个或多个 ApplicationContextInitializer 的实现类。

    • ApplicationContextInitializer 在 Spring Boot 启动过程中最早执行,它可以在应用程序上下文初始化前对应用程序的配置进行修改。

    ApplicationListener
    • ApplicationListener 是 Spring Framework 的标准接口,用于监听应用程序事件。Spring Boot 通过该接口支持了各种应用程序生命周期事件。

    • ApplicationListener 在应用程序启动过程中可以监听各种事件,例如上下文刷新事件、应用程序已启动事件等,根据事件类型的不同,监听器会在不同的阶段执行。

    CommandLineRunner
    • CommandLineRunner 是 Spring Boot 的一个接口,它定义了一个 run 方法,该方法在 Spring Boot 应用程序启动后执行。

    • CommandLineRunner 在应用程序启动完成后执行,通常用于执行应用程序启动后的一些初始化操作,如加载数据或执行特定任务。

  • 相关阅读:
    C++ primer 第十七章
    图论——Dijkstra算法matlab代码
    实现DM VXN 的各阶段
    (附源码)springboorCRM客户关系管理系统 毕业设计 316631
    04-Docker应用部署
    从 SAN 到 SDS,XSKY 持续助力中英人寿存储架构革新
    聚观早报 | iPhone接口将与安卓统一;《三体》动画定档12月3日
    Context
    SQLlabs46关
    数字化时代,企业为什么需要商业智能BI?
  • 原文地址:https://blog.csdn.net/Elaine2391/article/details/133873840