《springboot实战》
前言
大致翻了一下《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做了封装。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 设计模式(三):旅行的角度理解抽象工厂模式
- 机器学习中的优化算法!
- 【进阶篇】Python+Go——带大家一起另寻途径提高计算性能
- 爬取豆瓣高分电影。
- 快速带你上手Hyperledger Fabric环境搭建+开发测试
- 尝鲜使用微众银行WeCross实现基于哈希时间锁定的跨链转账
- Flutter 富文本第三方库 rich_text_widget
- 程序员的数学:线性代数之可视化
- 基于七牛SDK构建的Vue单页图片管理应用
- [Electron]仿写一个课堂随机点名小项目
- SyntaxError: (unicode error) 错误解决
- 理解CSS布局和块格式化上下文
- 基于后端云的吉他谱小程序开发
- 10个酷炫CMD命令
- Hog图像特征提取算法,HOG