转 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的博客.

Spring Boot 概念知识的更多相关文章

  1. Spring Boot系列(一) Spring Boot准备知识

    本文是学习 Spring Boot 的一些准备知识. Spring Web MVC Spring Web MVC 的两个Context 如下图所示, 基于 Servlet 的 Spring Web M ...

  2. Spring Boot基础知识

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  3. spring boot 概念

    最近新版本迭代,一直在弄框架替换和新技术实现的事儿. 本来想仔细介绍一下Spring Boot的各种东西,后来发现没啥写的,Spring Boot 说白了就是把你开发过程中用到的各种框架给你封装了一下 ...

  4. 第3章 Spring Boot 入门指南

    Part II. 入门指南 如果你刚刚开始使用Spring Boot,这是你的一部分内容! 在这里我们将会回答一些基本的“what?”, “how?” 和 “why?”的问题. 在这里你会找到一个详细 ...

  5. Spring Boot文档

    本文来自于springboot官方文档 地址:https://docs.spring.io/spring-boot/docs/current/reference/html/ Spring Boot参考 ...

  6. Spring Boot中文文档(官方文档翻译 基于1.5.2.RELEASE)

    作者:Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, ...

  7. Springboot 系列(一)Spring Boot 入门篇

    注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 由于 J2EE 的开发变得笨重,繁多的配置, ...

  8. 使用Spring Boot和RxJava的构建响应式REST API

    我不打算解释什么是响应式编程,也不解释为什么要使用它.我希望你已经在其他地方了解过,如果没有,你可以使用Google去搜索它.在本文中,我将告诉您如何使用专门针对Spring Boot和RxJava的 ...

  9. Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等

    这一节将在上一节的基础上,继续深入学习Spring Boot相关知识,其中主要包括@Async异步调用,@Value自定义参数.Mybatis.事务管理等. 本节所使用的代码是在上一节项目代码中,继续 ...

随机推荐

  1. 读CRecordset

    void CDictCol::LoadDictCol(void) { // 加载数据字典信息 CString cstrSql; cstrSql.Format("SELECT dc.TblID ...

  2. Step by Step 設定 TFS 2012 Create Team Project 權限 - 避免 TF218017、TF250044

    基本上權限的設定和 以往的 TFS 沒有什麼太大的差別 只是這次的權限設定畫面有略作些調整,我還是一併整理一下 當我們用 TFSSetup 的帳號安裝完 TFS 2012 後 想要在自已的電腦上用自已 ...

  3. Cohen-SutherLand算法(编码算法)

    转自:http://my.oschina.net/liqiong/blog/4921 Cohen-SutherLand算法(编码算法)   基本思想:对于每条线段P1P2,分为三种情况处理: (1)若 ...

  4. MNI模板和Talairach 模板的对比

    The MNI brain and the Talairach atlas SPM 96 and later use standard brains from the Montreal Neurolo ...

  5. GO语言 -- 调用DLL函数,填平所有的坑,最详尽攻略

    编译dll文件(源代码c++):g++ -shared main.cpp -o test.dll set GOARCH=386 第一个DLL函数,第一个参数,要求传入一个指针,直接指向[]byte类型 ...

  6. 今天才知道的JavaScript的真实历史~[转]

    JavaScript真的继承自Cmm吗?JavaScript与Java有多少关系?JavaScirpt最初的设计是怎样的?这个文章是从一个叫编程人生的网站上看到的.不知道出处在哪.在许多资料,Java ...

  7. Android之旅 自我图示总结四大组件

    最近学完了Android的四大组件的基础知识,自己总结了一个图示,希望自己看到这个图的时候能回忆起相关的知识点,与大家分享!

  8. IntelliJ IDEA 插件开发视频教程

    IntelliJ IDEA 插件开发视频教程 学习了:http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/plugins-develo ...

  9. (C++)浅谈多态基类析构函数声明为虚函数

    主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对 ...

  10. Wifidog及认证过程初分析

    Wifidog初分析 一.综述 wifidog是搭建无线热点认证系统的解决方案之一,他比nocat.nodog更适合互联网营销思路.常见的使用在openwrt系统上,它实现了路由器和认证服务器的数据交 ...