前言
大体翻了一下《springboot实战》这一本书,相比以前的文章,整体来讲,没有什么干货,实战感受也谈不上。仅当一本普通的科普读物,记录一下学习笔记。看完能够了解一些基本的知识,大体以下:html
- springboot的特性有哪些?
- 为何在配置文件里面配置一些变量,springboot就能提供某些功能?
- springboot内部自动配置原理是什么?内部如何实现?
- 常见的一些自定义配置有哪些?
- springboot提供的actuator是什么?配置以后,有什么用?如何本身定制actuator?
目录
概述
起步依赖
自动配置
自定义配置
测试
Actuator
部署
总结
一. 概述
发展史部分参考java
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),定义了其余库的传递依赖。经过传递依赖,添加一个依赖项就至关于添加了一堆依赖项web
2. 特色
- 只需添加一个依赖就替代繁琐的一堆依赖
- 不须要指定版本号,起步依赖自动定义好互相之间能够兼容的依赖版本
- 能够经过自定义版本号覆盖默认的版本号
- 经过exclusions配置,排除某些依赖
三. 自动配置
1. 原理:
利用了spring的条件化配置,容许配置存在于应用程序中,在知足某些特定条件以前都会忽略这个配置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 配置嵌入式服务器
2.2 配置日志
- 默认:logback输出info级别到控制台
- 自定义配置:
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页面测试
六. Actuator
1. 概述
提供不少生产级的特性,好比监控和度量springboot应用程序。提供不少端点用于了解应用程序内部运行情况tomcat
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
2.5 metrics
列出一系列应用程序度量信息 springboot
- 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
2.6 dump
2.7 health
- 监控应用程序监控情况
- 还能够看到磁盘空间信息,数据库信息等
- 由一个或多个监控指示器组成,根据classpath里类决定
- 下图是springboot自带的health指示器
2.8 shutdown
2.9 自定义信息
- url参数若是填配置文件中某个前缀,就会返回对应的属性值
3. 定制Actuator
3.1 概述
定制actuator的方式有:bash
- 重命名端点
- 启用或者禁用端点
- 自定义度量信息
- 建立自定义仓库存储跟踪信息
- 插入自定义的健康指示器
3.2 重命名端点
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. 部署到云端
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作了封装。