Spring Boot 概念知识

转 http://rapharino.com/coder/Spring-Boot-Induction/

Spring Boot Induction

发表于 2016-10-29   |   分类于 coder  |     |   阅读次数 45 

Spring Boot简化了基于Spring的应用开发,尝试封装 Spring 可怕繁杂的配置,以尽量少的配置创建一个独立的,产品级别的Spring应用。 Spring Boot使得Spring应用变的更轻量化,自动化,并为Spring平台及第三方库提供开箱即用的配置.Spring Boot 并未引入任何形式的代码生成技术,而是利用了 Spring4 的特性和项目构建实践 的优秀集成应用框架.因此本质上还是 Spring.

目标

  • 为所有Spring开发提供一个从根本上更快,且随处可得的入门体验。
  • 开箱即用,但通过不采用默认设置可以快速摆脱这种方式。
  • 提供一系列大型项目常用的非功能性特征,比如:内嵌服务器,安全,指标,健康检测,外部化配置。
  • 没有冗余代码生成,也不需要XML配置。

特性

  • 自动配置: 针对常用的功能,提供默认配置.以满足最基础功能.
  • 起步依赖: 提供大量的扩展库, 实现各个功能.
  • 命令行界面: 可选特性,无需构建项目, 实现 SpringBoot的动态编译和运行.
  • Actuator : 提供基础监控服务,提供运行时的检视应用内部情况的能力.包括
    • 上下文中的 Bean
    • 自动配置策略(条件化配置)
    • 环境变量,系统属性,配置属性,命令行参数 等.
    • 线程状态
    • HTTP 调用情况记录
    • 内存用量,垃圾回收,请求等相关指标.

快速入门

Spring Boot 极力的贴合 约定优于配置的设计范式.下面是一个 Demo,以最少的代码,实现一个 Web Service.

maven 构建项目

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30
<!-- boot parent -->

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.3.2.RELEASE</version>

<relativePath/> <!-- lookup parent from repository -->

</parent>

<dependencies>

<!-- boot starter -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter</artifactId>

</dependency>

<!-- web starter -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

编写代码

1

2

3

4

5

6

7

8

9

10

11

12

13
@RestController

@EnableAutoConfiguration

public class App {

@RequestMapping("/")

String home() {

return "Hello World!";

}

public static void main(String[] args) throws Exception {

SpringApplication.run(App.class, args);

}

}

如果使用浏览器打开localhost:8080,你应该可以看到如下输出:

1
Hello World!

启动流程

rp-core 中的 SpringApplication 的实现方式和 SpringBoot 类似,主要借鉴其 自动配置,ApplicationContext生命周期管理功能.

  1. xml 或者 java code 实现对象构建和依赖绑定的描述信息.
  2. 创建AnnotationConfigApplicationContext(或者AnnotationConfigEmbeddedWebApplicationContext) (上图错误.)
  3. SpringFactoriesLoader.loadFactoryNames()读取了ClassPath下面的META-INF/spring.factories文件.其中主要包括ApplicationContextInitializer,ApplicationListener,和@Configuration 其相关实现类(注解类).
  4. 为 ApplicationContext 注册ApplicationContextInitializer.ApplicationListener.(原生 Spring 提供的扩展)
  5. 启动 自动配置流程
    1. SpringBootApplication注解中带有EnableAutoConfiguration注解

      1
      
      2
      
      3
      
      4
      
      5
      
      6
      
      7
      
      8
      
      9
      
      10
      
      11
      
      12
      
      13
      
      14
      
      15
      
      16
      
      17
      
      18
      
      19
      
      20
      
      21
      
      22
      
      23
      
      24
      
      25
      
      @Target(ElementType.TYPE)
      
      @Retention(RetentionPolicy.RUNTIME)
      
      @Documented
      
      @Inherited
      
      @AutoConfigurationPackage
      
      @Import(EnableAutoConfigurationImportSelector.class)
      
      public @interface EnableAutoConfiguration {
      
      String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
      
      /**
      
      * Exclude specific auto-configuration classes such that they will never be applied.
      
      * @return the classes to exclude
      
      */
      
      Class<?>[] exclude() default {};
      
      /**
      
      * Exclude specific auto-configuration class names such that they will never be
      
      * applied.
      
      * @return the class names to exclude
      
      * @since 1.3.0
      
      */
      
      String[] excludeName() default {};
      
      }
      
    2. EnableAutoConfiguration 为容器注册了一个EnableAutoConfigurationImportSelector对象.它则是自动配置的核心类.
    3. EnableAutoConfigurationImportSelector实现了ImportSelector的selectImports方法:
      1. SpringFactoriesLoader.loadFactoryNames()获取配置相关的元数据.

        1
        
        2
        
        3
        
        4
        
        5
        
        6
        
        7
        
        8
        
        9
        
        10
        
        11
        
        # Auto Configure
        
        org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
        
        org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
        
        org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
        
        org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
        
        org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
        
        org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
        
        org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
        
        org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
        
        ......
        
        org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
        

      2. 必要的处理.如去重,排序,条件依赖.
      3. 返回交由容器注册相关实例对象.
    4. 容器初始化完成.(额外会提供点周边服务,如 CommandLineRunner)

外置配置

SpringBoot 兼顾 Spring的强大功能,并且提供极强的扩展性.在 SpringBoot及其周边项目有大量的 Starter模块,实现各个功能.如 spring-boot-starter-web,spring-boot-starter-jmx,spring-boot-starter-mybatis.他们有自己的默认配置,也可以通过 Spring 的属性 API 进行自定义.

属性API

  • PropertySource:属性源,key-value属性对抽象,比如用于配置数据
  • PropertyResolver:属性解析器,用于解析相应key的value
  • Environment:环境,本身是一个PropertyResolver,但是提供了Profile特性,即可以根据环境得到相应数据(即激活不同的Profile,可以得到不同的属性数据,比如用于多环境场景的配置(正式机、测试机、开发机DataSource配置))
  • Profile:剖面,只有激活的剖面的组件/配置才会注册到Spring容器,类似于maven中profile

配置读取顺序

SpringBoot 配置使用一个特别的顺序进行合理的配置和覆盖.允许开发者通过配置服务,静态文件,环境变量,命令行参数,注解类等,用以外化配置.覆盖顺序如下:

  1. 命令行参数
  2. 来自于 java:comp/env 的 JNDI 属性
  3. 操作系统环境变量
  4. 在打包的 jar 外的配置文件(包括 propertis,yaml,profile变量.)
  5. 在打包的 jar 内的配置文件(包括 propertis,yaml,profile变量.)
  6. @Configuration 类的@PropertySource 注解
  7. 应用框架默认配置

application.properties和application.yml文件能放在以下四个位置。亦拥有覆盖顺序(高 - 低)

  • 外置,在相对于应用程序运行目录的/config子目录里。
  • 外置,在应用程序运行的目录里。
  • 内置,在config包内。
  • 内置,在Classpath根目录。

每个模块都有自己的配置.在此不再赘述.

Actuator

Actuator端点,实现应用内部信息监控检测.实际开发和生产(必要控制)场景下,它的作用必不可少.

(除了提供 rest service.还提供了 remote shell ,和 mbean 方式,目的类似).


原创出处:www.rapharino.com 作者:Rapharino IN,请继续关注Rapharino的博客.
时间: 2024-10-20 14:54:57

Spring Boot 概念知识的相关文章

给你一份Spring Boot核心知识清单①-1

预警:本文非常长,建议先mark后看,也许是最后一次写这么长的文章 由于51博客对文章字符数的限制,不得已分成两篇文章 说明:前面有4个小节关于Spring的基础知识,分别是:IOC容器.JavaConfig.事件监听.SpringFactoriesLoader详解,它们占据了本文的大部分内容,虽然它们之间可能没有太多的联系,但这些知识对于理解Spring Boot的核心原理至关重要,如果你对Spring框架烂熟于心,完全可以跳过这4个小节.正是因为这个系列的文章是由这些看似不相关的知识点组成,

给你一份Spring Boot核心知识清单①-2

由于博客字数限制,不允许发大于20w个字符的文章,所以需要分成两篇,接上文 五.出神入化:揭秘自动配置原理 典型的Spring Boot应用的启动类一般均位于 src/main/java根路径下,比如 MoonApplication类: @SpringBootApplication public class MoonApplication {     public static void main(String[] args) {         SpringApplication.run(Mo

二、Spring Boot基础

[学习Spring Boot基础,创建Spring Boot项目,讲解Spring Boot的配置,是学习Spring Cloud Alibaba的必知必会.] Spring Boot基础 快速创建应用  https://www.cnblogs.com/my-program-life/p/11592838.html Spring Boot基础知识  https://www.cnblogs.com/my-program-life/p/11958428.html 补充知识: Spring Boot

Spring Boot -- Spring Boot进阶

这一节将在上一节的基础上,深入学习Spring Boot相关知识,其中主要包括@Async异步调用,自定义参数.Mybatis等. 一.使用@Async实现异步调用 要在springboot中使用异步调用方法,只要在被调用的方法上面加上@Async就可以了: 1.准备工作 准备一个Spring Boot项目,在App类上加上@EnableAsync注解开启异步: package com.goldwind; import org.springframework.boot.SpringApplica

阿里P7给你一份超详细 Spring Boot 知识清单

在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用.因而Spring Boot应用本质上就是一个基于Spring框架的应用,它是Spring对"约定优先于配置"理念的最佳实践产物,它能够帮助开发者更快速高效地构建基于Spring生态圈的应用.那Spring Boot有何魔法?自动配置.起步依赖.Actuator.命令行界面(CLI) 是Spring Boot最重要的4大核心特性,其中CLI是

RabbitMQ 核心概念及与 Spring Boot 2 的整合

RabbitMQ 简介 RabbitMQ 是什么 RabbitMQ 是一个用 Erlang 编写的开源的消息队列中间件,它实现了 AMQP 协议(其实还实现了 MTQQ 等消息协议).和其他两个主流的消息队列中间件 Kafka 和 RocketMQ 相比,拥有更低的延迟.更高的稳定性.更完备的功能.更完善的文档支持以及较活跃的开源社区支持,但是在吞吐量上和分布式扩展能力上逊色一些. AMQP 是什么 AMQP(Advanced Message Queuing Protocol),高级消息队列协议

【springboot】给你一份Spring Boot知识清单

目录: 一.抛砖引玉:探索Spring IoC容器 1.1.Spring IoC容器 1.2.Spring容器扩展机制 二.夯实基础:JavaConfig与常见Annotation 2.1.JavaConfig 2.2.@ComponentScan 2.3.@Import 2.4.@Conditional 2.5.@ConfigurationProperties与@EnableConfigurationProperties 三.削铁如泥:SpringFactoriesLoader详解 四.另一件

RabbitMq+Spring boot 消息生产者向队列发送消息 (一)

本人学习新框架方法. 一.先学习框架基本知识,也就是看这本书的前三章,了解基本概念.比如这个Rabbitmq,我会先看一些概念,比如,交换机,路由器,队列,虚拟机. 二.然后写代码,写demo,有哪些不懂的地方直接再去翻书或者google找资料,带着问题去学习,学的更快更扎实一些. 三.然后再看这个框架的应用场景,自己能否独立的写一些简单的项目,来验证自己的成果. 四.实际项目积累经验. RabbitMq 消息生产者向队列发送消息 (一) MQ分为消息生产者和消息消费者,这次做的主要是消息的生产

《深入实践Spring Boot》阅读笔记之一:基础应用开发

上上篇「1718总结与计划」中提到,18年要对部分项目拆分,进行服务化,并对代码进行重构.公司技术委员会也推荐使用spring boot,之前在各个技术网站中也了解过,它可以大大简化spring配置和各个组件的使用,与其关系密切的Spring Cloud可以很好支持微服务的开发. 为了后续项目的应用,想利用这2天看下<深入实践Spring Boot>,这本书是17年双十一期间在京东上买的,一直懒着没看.这本书偏应用,适合初学者看,正文内容也就240多页,看的会比较轻松. 目前,看完了第一部分,