《springboot实战》

本文深入剖析SpringBoot的自动配置、起步依赖及Actuator功能,介绍其发展历史、核心特性和内部实现原理,涵盖自定义配置、测试、部署等多个方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

大致翻了一下《springboot实战》这一本书,相比之前的文章,总体来说,没有什么干货,实战感觉也谈不上。仅当一本普通的科普读物,记录一下学习笔记。看完可以了解一些基本的知识,大致如下:

  • springboot的特性有哪些?
  • 为什么在配置文件里面配置一些变量,springboot就能提供某些功能?
  • springboot内部自动配置原理是什么?内部如何实现?
  • 常见的一些自定义配置有哪些?
  • springboot提供的actuator是什么?配置之后,有什么用?如何自己定制actuator?

目录

概述

起步依赖

自动配置

自定义配置

测试

Actuator

部署

总结

一. 概述

发展史部分参考

1. spring家族发展史

  • 2002年,Rod Johson撰写了一本Expert One-on-One J2EE设计的书,提出了依赖注入的解决方案
  • 2004年:spring1.0发布,依赖注入和声明式事务意味着组件直接不存在紧耦合,改变了开发企业级java应用程序的方式
  • 2006年:spring2.0发布,下载量超过100w, 可以在配置里使用自定义的xml命名空间,更简单的配置让spring更好使用
  • 2007年,spring2.5发布,更优雅的面向注解的依赖注入模型(@Component和@Autowired)和面向注解的spring MVC编程模型
  • 2009年,spring3.0发布,全新的javabean配置取代xml,@Enable开头的注解得到完善,可以书写没有xml的程序
  • 2013年,spring4.0发布,spring框架的一大进步,支持java8, 更高的第三方依赖,条件化配置,根据应用程序的classpath,环境等决定使用哪些配置
  • springboot:实现自动配置,起步依赖,actuator等

2. springboot发展史

  • 2012年:Mike Youngstrom在spring jira中创建了一个功能需求:在spring框架中支持无容器web应用程序
  • 2013年:开始研发该需求
  • 2014年:springboot 1.0.0版本发布
  • 2014年:springboot 1.1版本: 支持elasticsearch和Apache solr
  • 2015年:springboot 1.2版本:升级到tomcat8,spring4.1,支持SpringBootApplication注解
  • 2016年:springboot 1.3版本:支持spring-boot-devtools,部门自动配置和可执行的jar
  • 2017年1月:springboot 1.4:分析穹顶失败和RestTemplateBuilder
  • 2017年2月:sprinboot 1.5:支持kafka,动态修改应用程序日志级别
  • 2018年3月:springboot2.0:基于java8,支持java9,支持Quartz,支持嵌入netty

3. springboot特性

  • 自动配置:自动根据配置文件的一些属性配置相应的bean,无需手动配置
  • 起步依赖:自动管理jar包依赖
  • 命令行界面:自动检测代码依赖哪个包
  • actuator:提供在运行时见识应用程序内部情况的能力

4. sprinboot不是什么

  • 不是应用服务器:在应用程序里嵌入了一个servlet容器
  • 没有引入任何形式的代码生成,只是利用了条件化配置特性以及maven的传递依赖解析实现自动配置

二. 起步依赖

1. 本质

起步依赖本质是一个maven项目对象模型(project object module,pom),定义了其他库的传递依赖。通过传递依赖,添加一个依赖项就相当于添加了一堆依赖项

2. 特点

  • 只需添加一个依赖就替代繁琐的一堆依赖
  • 不需要指定版本号,起步依赖自动定义好互相之间可以兼容的依赖版本
  • 可以通过自定义版本号覆盖默认的版本号
  • 通过exclusions配置,排除某些依赖

三. 自动配置

1. 原理:

利用了spring的条件化配置,允许配置存在于应用程序中,在满足某些特定条件之前都会忽略这个配置

2. 实现:

  • 满足的条件:定义一个类XXX.java实现Condition接口,重写matches方法
  • 使用:在要被初始化的bean前面使用@Conditional(XXX.class),即实现了条件化配置

3. springboot自定义的条件配置

  • ConditionalOnBean: 配置了特定的bean
  • ConditionalOnMissingBean: 没有配置特定的bean。关键注解,用户如果自定义了一个bean,就不会使用自动配置的bean。
  • ConditionalOnClass: classpath里有指定的bean
  • ConditionalOnMissingClass:classpth里缺少指定的bean
  • ConditionalOnExpression:特定的表达式为true
  • ConditionalOnJava:匹配特定的java版本
  • ConditionalOnProperty:特定的配置属性有一个明确值
  • ConditionalOnWebApplication: 是一个web应用程序
  • ConditionalOnNotWebApplication:不是一个web程序

4. 源码实例:

  • DataSourceAutoConfiguration使用了@ConditionalOnClass注解,classpath里需要有DataSource类和EmbededDatabaseType类才会自动配置,否则配置就会被忽略。

使用spring security自动配置的条件

  • classpath中要有WebSecurityConfiguerAdapter类
  • 没有自动配置WebSecurityConfigureAdapter实体类
  • 是一个web应用程序

四. 自定义配置

使用自动配置可以不用手动配置bean,如果修改配置的某个参数,是否自动配置就不生效了呢? 答案是否定的,springboot提供了300多个用于微调的属性,可以自由掌握配置。

1. 属性配置来源(优先级由高到低,高覆盖低)

  • 命令行参数
  • java:comp/env里的JNDI属性
  • JVM系统属性
  • 操作系统环境变量
  • 应用程序以外的application.properties或application.yml
  • 打包在应用程序内的application.properties或application.yml(yml优先级高于properties)
  • 通过@PropertySource标注的属性源
  • 默认属性

2. 自动配置属性实例

2.1 配置嵌入式服务器

  • 默认:tomcat的8080端口
  • 修改端口:
    server.port: 8081
    复制代码
  • 配置https服务:
    server:
        ssl:
            key0-store: file: ///path/mykeys.jks
            key-password: password
            ssl-store-password: password2
    复制代码

2.2 配置日志

  • 默认:logback输出info级别到控制台
  • 自定义配置:
    • 方法一:修改默认属性
      logging:
          path: /var/logs/
          file: warn.log
          level:
              root: warn
              org.springframework.security:Debug
              
      复制代码
    • 方法二: 自定义一个logback.xml配置文件
    • 方法三:自定义文件名的配置文件
      logging:
          config:
              classpath:loggin-config.xml
      复制代码

2.3 配置数据源:

无需指定jdbc驱动,会根据url自动识别

```
spring:
    datasource:
        url: xxx
        username: xxx
        password: xxx
```
复制代码

2.4 配置自定义属性

  • 在application.yml中指定配置属性的名称和值
  • 在配置类中使用@ConfigurationProperties(prefix="XX")
  • 在配置类中声明要注入的变量和setter方法

注意:

  • @ConfigurationProperties不会自动识别,需要添加@EnableConfigurationProperties注解,因为sprinboot已经自动添加了,无需手动再添加
  • springboot属性解析器会自动把驼峰规则的属性和使用连字符或下划线的同名属性关联起来

3. profile配置

  • 使用@Profile("production") 注解
  • 配置不同的application-{profile}.properties或yml文件
  • 在同一个yml文件中配置,用---分隔开

五. 测试

1. spring测试

  • @RunWith(SpringJunit4ClassRunner.class) 开启spring集成测试
  • @ContextConfiguration 指定加载应用程序上下文

2. springboot测试

  • @SpringApplicationConfiguration 开启springboot集成测试
  • @WebAppConfiguration 开启web测试
  • MockMvc 在一个模拟的servlet容器里测试
  • @WebIntegrationTest 启动一个嵌入式Servlet容器,配合RestTemplate测试

3. html页面测试

  • Selenium工具

六. Actuator

1. 概述

提供很多生产级的特性,比如监控和度量springboot应用程序。提供很多端点用于了解应用程序内部运行状况

2. 端点分类

2.1 bean

  • 获取上下文中所有注入的bean
  • 包括五类信息
    • bean: 名称或id
    • resource:class文件的物理位置,url格式
    • dependencies:注入的bean列表
    • scope:作用域
    • type:java类型

2.2 autoconfig

  • 列出了自动配置时哪些条件满足,哪些条件不满足,为什么会生成某个bean
  • 提供众多带有@Conditional注解的配置类

2.3 env

  • 列出所有环境属性列表,无论是否被用到
  • 包括环境变量,JVM属性,命令行参数,配置文件属性
  • 属性里面带有password,secret,key的属性都会被隐藏,只显示*

2.4 mappings

  • 列出web界面的控制器和请求处理方法

2.5 metrics

列出一系列应用程序度量信息

  • gc.*: 垃圾收集相关。java.lang.management.GarbageCollectorMXBean得到
  • mem.*: 内存相关。java.lang.RunTime
  • heap.*: 堆相关。java.lang.management.MemoryUsage
  • classes.*: 类加载器相关。
  • processors,uptime,instance等:系统相关
  • threads.*: 线程池相关
  • datasource.*: 数据源
  • httpsessions.*: tomcat会话相关
  • counter.status.*: Http相关

2.6 trace

  • 追踪web请求详细信息
  • 能显示最近100个请求

2.6 dump

  • 提供应用程序线程快照

2.7 health

  • 监控应用程序监控状况
  • 还可以看到磁盘空间信息,数据库信息等
  • 由一个或多个监控指示器组成,根据classpath里类决定
  • 下图是springboot自带的health指示器

2.8 shutdown

  • 关闭应用程序,该功能默认关闭

2.9 自定义信息

  • url参数如果填配置文件中某个前缀,就会返回对应的属性值

3. 定制Actuator

3.1 概述

定制actuator的方式有:

  • 重命名端点
  • 启用或者禁用端点
  • 自定义度量信息
  • 创建自定义仓库存储跟踪信息
  • 插入自定义的健康指示器

3.2 重命名端点

  • 每个端点都有一个id用来决定端点的路径
  • 可以通过修改端点id来改变端点的路径
  • 要设置的属性名为:endpoints.endpoint-id.id,比如:endpoints.shutdown.id=kill

3.3 启用和禁用端点

  • 默认情况下,2.0.1之前的版本,除了/shutdown外,都启用。2.0.1之后的版本,默认只启用部分端点
  • 禁用端点:endpoints.endpoint-id.id.enabled=false
  • 禁用全部端点:endpoints.enabled=false

3.4 添加自定义度量信息

3.5 创建自定义跟踪仓库

  • 默认情况下,/trace端点跟踪的信息都存储在内存中,存储最近100条。
  • 可自定义InMemoryHttpTraceRepository,调用setCapacity设置超过100的数目
  • 也可继承HttpTraceRepository接口,重写add和find方法,将追踪信息存入mongo或者es等地方

3.6 插入自定义监控指示器

  • 实现HealthIndicator接口
  • 重写health方法

七. 部署与工具

1. 构建war文件

  • 标签由jar改为war
  • 此时的war包还没有启用springmvc dispatchservlet的web.xml文件或者servlet初始化类
  • 继承SpringBootInitializer, 重新configure方法,将含有main的主类传进去

2. 部署到云端

  • 部署到cloudfundry
  • 部署到heroku

3. 开发者工具

  • 依赖库:spring-boot-devtools
  • 提供的功能:classpath文件变化自动重启, 资源文件变化自动刷新浏览器,远程开发,默认的开发属性

3.1 自动重启

  • 第三方jar会放到基础加载器里,应用程序代码放到一个单独的重启类加载器里,检查变更时只重启类加载器
  • 资源视图默认被排除:包括/META-INFO/resources, /resources, /static, /public和/template路径
  • 可修改默认的排除目录:spring.devtools.restart.exclude=/static/, /templates/
  • 关闭自动重启:spring.devtools.restart.enabled=false
  • 设置触发条件重启:spring.devtools.restart.trigger-file: xx

3.2 LiveReload

  • 实现自动刷新浏览器
  • 需要在浏览器中安装LiveReload插件

总结

简单回顾下前言里面的几个问题

1. springboot的特性有哪些?

自动配置,起步依赖,Actuator

2. 为什么在配置文件里面配置一些变量,springboot就能提供某些功能?

springboot提供了自动配置功能,自动注入了很多实现类

3. springboot内部自动配置原理是什么?内部如何实现?

利用了spring4提供的条件配置功能,根据某些条件判断实现自动配置。所说的条件包括:classpath里面有没有依赖某个类,spring里有没有配置了特定的bean等等。通过ConditionalOnMissingBean,ConditionalOnBean等注解添加到配置类上。

4. 常见的一些自定义配置有哪些?

数据源配置,日志配置,profile配置等

5. springboot提供的actuator是什么?配置之后,有什么用?如何自己定制actuator?

actuator提供很多应用程序内部状况信息,包括配置的bean信息,健康信息,上下文信息,jvm信息等等。 可以通过实现HealthIndicator接口,自定制自己的actuator。springboot-admin就是基于actuator做了封装。

SpringBoot实战(第4版)清晰文字版,第 1 章 入门 ................................................ 1 1.1 Spring 风云再起 ........................................ 1 1.1.1 重新认识 Spring ............................ 2 1.1.2 Spring Boot 精要 ........................... 3 1.1.3 Spring Boot 不是什么 ................... 6 1.2 Spring Boot 入门 ....................................... 6 1.2.1 安装 Spring Boot CLI .................... 7 1.2.2 使用 Spring Initializr 初始化 Spring Boot 项目 .......................... 10 1.3 小结 ......................................................... 18 第 2 章 开发第一个应用程序 .................... 19 2.1 运用 Spring Boot ..................................... 19 2.1.1 查看初始化的 Spring Boot 新项目 .......................................... 21 2.1.2 Spring Boot 项目构建过程 解析 .............................................. 24 2.2 使用起步依赖 .......................................... 27 2.2.1 指定基于功能的依赖 ................... 28 2.2.2 覆盖起步依赖引入的传递依赖 .... 29 2.3 使用自动配置 .......................................... 30 2.3.1 专注于应用程序功能 ................... 31 2.3.2 运行应用程序 .............................. 36 2.3.3 刚刚发生了什么 ........................... 38 2.4 小结 ......................................................... 41 第 3 章 自定义配置 .................................... 42 3.1 覆盖 Spring Boot 自动配置 ..................... 42 3.1.1 保护应用程序 .............................. 43 3.1.2 创建自定义的安全配置 ............... 44 3.1.3 掀开自动配置的神秘面纱 ........... 48 3.2 通过属性文件外置配置 ........................... 49 3.2.1 自动配置微调 .............................. 50 3.2.2 应用程序 Bean 的配置外置 ......... 55 3.2.3 使用 Profile 进行配置 .................. 59 3.3 定制应用程序错误页面 ........................... 62 3.4 小结 ......................................................... 64 第 4 章 测试 ............................................... 66 4.1 集成测试自动配置 .................................. 66 4.2 测试 Web 应用程序 ................................. 68 4.2.1 模拟 Spring MVC ........................ 69 4.2.2 测试 Web 安全 ............................. 72 4.3 测试运行中的应用程序 ........................... 74 4.3.1 用随机端口启动服务器 ............... 75 4.3.2 使用 Selenium 测试 HTML 页面 ............................................. 76 4.4 小结 ......................................................... 78 第 5 章 Groovy 与 Spring Boot CLI ......... 80 5.1 开发 Spring Boot CLI 应用程序 .............. 80 5.1.1 设置 CLI 项目 .............................. 81 5.1.2 通过 Groovy 消除代码噪声 ......... 81 5.1.3 发生了什么 .................................. 85 5.2 获取依赖 .................................................. 86 5.2.1 覆盖默认依赖版本 ....................... 87 5.2.2 添加依赖仓库 .............................. 88 5.3 用 CLI 运行测试 ...................................... 89 5.4 创建可部署的产物 .................................. 91 5.5 小结 ......................................................... 91 第 6 章 在 Spring Boot 中使用 Grails ...... 93 6.1 使用 GORM 进行数据持久化 ................. 93 2 目 录 6.2 使用 Groovy Server Pages 定义视图 ....... 98 6.3 结合 Spring Boot 与 Grails 3 ................. 100 6.3.1 创建新的 Grails 项目 ................. 100 6.3.2 定义领域模型 ............................ 103 6.3.3 开发 Grails 控制器 ..................... 104 6.3.4 创建视图 .................................... 105 6.4 小结 ....................................................... 107 第 7 章 深入 Actuator .............................. 108 7.1 揭秘 Actuator 的端点 ............................ 108 7.1.1 查看配置明细 ............................ 109 7.1.2 运行时度量 ................................ 115 7.1.3 关闭应用程序 ............................ 121 7.1.4 获取应用信息 ............................ 121 7.2 连接 Actuator 的远程 shell .................... 122 7.2.1 查看 autoconfig 报告 ........... 123 7.2.2 列出应用程序的 Bean ............... 124 7.2.3 查看应用程序的度量信息 ......... 124 7.2.4 调用 Actuator 端点 .................... 125 7.3 通过 JMX 监控应用程序 ....................... 126 7.4 定制 Actuator......................................... 128 7.4.1 修改端点 ID ............................... 128 7.4.2 启用和禁用端点 ........................ 129 7.4.3 添加自定义度量信息 ................. 129 7.4.4 创建自定义跟踪仓库 ................. 132 7.4.5 插入自定义健康指示器 ............. 134 7.5 保护 Actuator 端点 ................................ 136 7.6 小结 ....................................................... 138 第 8 章 部署 Spring Boot 应用程序 ........ 139 8.1 衡量多种部署方式 ................................ 139 8.2 部署到应用服务器 ................................ 140 8.2.1 构建 WAR 文件 ......................... 141 8.2.2 创建生产 Profile ........................ 142 8.2.3 开启数据库迁移 ........................ 145 8.3 推上云端 ............................................... 150 8.3.1 部署到 Cloud Foundry ............... 150 8.3.2 部署到 Heroku ........................... 153 8.4 小结 ....................................................... 155 附录 A Spring Boot 开发者工具.............. 157 附录 B Spring Boot 起步依赖 ................. 163 附录 C 配置属性 ...................................... 169 附录 D Spring Boot 依赖 ......................... 202
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值