springboot实战读书笔记

Spring Boot精要
Spring Boot重要的是以下四个核心。
自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置。起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。 
命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序, 无需传统项目构建。 
Actuator:让你能够深入运行中的Spring Boot应用程序,一探究竟。

使用Spring Initializr初始化 Spring Boot项目
Spring Initializr从本质上来说就是一个Web应用程序,它能为你生成Spring Boot项目结构。虽 然不能生成应用程序代码,但它能为你提供一个基本的项目结构,以及一个用于构建代码的 Maven或Gradle构建说明文件。你只需要写应用程序的代码就好了

Spring Initializr有几种用法。 
通过Web界面使用。 
通过Spring Tool Suite使用。 
通过IntelliJ IDEA使用。 
使用Spring Boot CLI使用。

起步依赖与自动配置
@SpringBootApplication开启了Spring的组件扫描和Spring Boot的自动配置功能。
实际 上,@SpringBootApplication将三个有用的注解组合在了一起。 
Spring的@Configuration:标明该类使用Spring基于Java的配置。虽然本书不会写太多 配置,但我们会更倾向于使用基于Java而不是XML的配置。 
Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器类和其他组件才能被 自动发现并注册为Spring应用程序上下文里的Bean。本章稍后会写一个简单的Spring MVC 控制器,使用@Controller进行注解,这样组件扫描才能找到它。 
Spring Boot的@EnableAutoConfiguration:这个不起眼的小注解也可以称为就是这一行配置开启了Spring Boot自动配置的魔力,让你不用再写成 篇的配置了。

起步依赖
覆盖起步依赖引入的传递依赖
在Maven里,可以用元素来排除传递依赖
Maven总是会用近的依赖,也就是说,你在项目的构建说明文件里增加的这个依赖,会覆 盖传递依赖引入的另一个依赖

使用自动配置
利用了Spring的条件化配置,这是Spring 4.0引入 的新特性。条件化配置允许配置存在于应用程序中,但在满足某些特定条件之前都忽略这个配置。
在Spring里可以很方便地编写你自己的条件,你所要做的就是实现Condition接口,覆盖它 的matches()方法

当你用Java来声明Bean的时候,可以使用这个自定义条件类:
@Conditional(JdbcTemplateCondition.class)
public MyService myService() { … }
JdbcTemplateCondition为Condition实现类

Spring Boot定义了很多更有趣的条件,并把它们运用到了配 置类上,
这些配置类构成了Spring Boot的自动配置。
Spring Boot运用条件化配置的方法是,定义多个特殊的条件化注解,并将它们用到配置类上。表2-1列出了Spring Boot提供的条件化注解。

表2-1 自动配置中使用的条件化注解
条件化注解 配置生效条件
@ConditionalOnBean 配置了某个特定Bean
@ConditionalOnMissingBean 没有配置特定的Bean
@ConditionalOnClass Classpath里有指定的类
@ConditionalOnMissingClass Classpath里缺少指定的类
@ConditionalOnExpression 给定的Spring Expression Language(SpEL)表达式计算结果为true
@ConditionalOnJava Java的版本匹配特定值或者一个范围值
@ConditionalOnJndi 参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI InitialContext
@ConditionalOnProperty 指定的配置属性要有一个明确的值
@ConditionalOnResource Classpath里有指定的资源
@ConditionalOnWebApplication 这是一个Web应用程序
@ConditionalOnNotWebApplication 这不是一个Web应用程序

一般来说,无需查看Spring Boot自动配置类的源代码,但为了演示如何使用表2-1里的注解, 我们可以看一下DataSourceAutoConfiguration里的这个片段(这是Spring Boot自动配置库 的一部分):

@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @EnableConfigurationProperties(DataSourceProperties.class)
@Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class })
public class DataSourceAutoConfiguration {
}

如你所见,DataSourceAutoConfiguration添加了@Configuration注解,它从其他配 置类里导入了一些额外配置,还自己定义了一些Bean。重要的是,DataSourceAutoCon- figuration上添加了@ConditionalOnClass注解,要求Classpath里必须要有DataSource和 EmbeddedDatabaseType。如果它们不存在,条件就不成立,DataSourceAutoConfiguration 提供的配置都会被忽略掉。

自定义配置
本章内容 
覆盖自动配置的Bean 
用外置属性进行配置 
自定义错误页

覆盖Spring Boot自动配置
覆盖自动配置很简单,就当自动配置不存在,直接显式地写一段配置。这段显式配置的形式 不限,Spring支持的XML和Groovy形式配置都可以。
Spring Boot会发现你的配置,随后降低自动配置的优先级,以你的配置为准

通过属性文件外置配置
Spring Boot应用程序有多种设置途径。
Spring Boot能从多种属性源获得属性,包括 如下几处。
(1) 命令行参数
(2) java:comp/env里的JNDI属性
(3) JVM系统属性
(4) 操作系统环境变量
(5) 随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random. long})
(6) 应用程序以外的application.properties或者appliaction.yml文件
(7) 打包在应用程序内的application.properties或者appliaction.yml文件
(8) 通过@PropertySource标注的属性源
(9) 默认属性

这个列表按照优先级排序,
也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先 级的相同属性。例如,命令行参数会覆盖其他属性源里的属性。

application.properties和application.yml文件能放在以下四个位置。
(1) 外置,在相对于应用程序运行目录的/config子目录里。
(2) 外置,在应用程序运行的目录里。
(3) 内置,在config包内。
(4) 内置,在Classpath根目录。

(1)(2)适合用在服务器启动, 生产环境, 必须先进入当前目录, 否则无效
(3)(4)适合IDE中启动, 开发环境

同样,这个列表按照优先级排序。
也就是说,/config子目录里的application.properties会覆盖 应用程序Classpath里的application.properties中的相同属性。
此外,如果你在同一优先级位置同时有application.properties和application.yml,那么application. yml里的属性会覆盖application.properties里的属性。

Yml文件在内存中保存是有顺序的, 当需要配置文件内容有上下顺序时候, 需要注意, 比如zuul的匹配关系

应用程序 Bean的配置外置
@ConfigurationProperties(prefix=“amazon”)
public class ReadingListController {}

使用@ConfigurationProperties注解,这说明该 Bean的属性应该是(通过setter方法)从配置属性值注入的。,prefix属性说明 ReadingListController应该注入带amazon前缀的属性。 综合起来,我们指定ReadingListController的属性应该从带amazon前缀的配置属性中 进行注入。ReadingListController只有一个setter方法,就是设置associateId属性用的setter 方法。因此,设置Amazon Associate ID唯一要做的就是添加amazon.associateId属性,把它加 入支持的任一属性源位置里即可。 例如,我们可以在application.properties里设置该属性:
amazon.associateId=habuma-20

开启配置属性 从技术上来说,@ConfigurationProperties注解不会生效,除 非先向Spring配置类添加@EnableConfigurationProperties注解。但通常无需这么 做,因为Spring Boot自动配置后面的全部配置类都已经加上了@EnableConfigura- tionProperties注解。因此,除非你完全不使用自动配置(那怎么可能?),否则就 无需显式地添加@EnableConfigurationProperties

还有一点需要注意,Spring Boot的属性解析器非常智能,它会自动把驼峰规则的属性和使用 连字符或下划线的同名属性关联起来。换句话说,amazon.associateId这个属性和 amazon.associate_id以及amazon.associate-id都是等价的。用你习惯的命名规则就好

在一个类里收集属性
虽然在ReadingListController上加上@ConfigurationProperties注解跑起来没问 题,但这并不是一个理想的方案。 与其在ReadingListController里加载配置属性,还不如创建一个单独的Bean,为它加上 @ConfigurationProperties注解,让这个Bean收集所有配置属性。
@Component
@ConfigurationProperties(“amazon”)
public class AmazonProperties {

有了加载amazon.associateId配置属性的AmazonProperties后,我们可以调整 ReadingListController. 让它从注入的AmazonProperties中获取 Amazon Associate ID

3.2.3 使用Profile进行配置
@Profile(“production”) // 激活某个配置类时候使用
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter { }

这里用的@Profile注解要求运行时激活production Profile,这样才能应用该配置。如果 production Profile没有激活,就会忽略该配置,而此时缺少其他用于覆盖的安全配置,于是应 用自动配置的安全配置

设置spring.profiles.active属性就能激活Profile,任意设置配置属性的方式都能用于 设置这个值。可以向application.yml里添加spring.profiles.active属性:
spring:
profiles:
active: production

使用特定于Profile的属性文件
如果你正在使用application.properties,可以创建额外的属性文件,
遵循application-{profile}. properties这种命名格式,这样就能提供特定于Profile的属性了。开发环境的配置可以放在名为application-development.properties的文件里

与此同时,那些并不特定于哪个Profile或者保持默认值(以防万一有哪个特定于Profile的配 置不指定这个值)的属性,可以继续放在application.properties里, active激活也放在这里

使用多Profile YAML文件进行配置
如果使用YAML来配置属性,则可以遵循与配置文件相同的命名规范,
即创建application- {profile}.yml这样的YAML文件,并将与Profile无关的属性继续放在application.yml里。 但既然用了YAML,你就可以把所有Profile的配置属性都放在一个application.yml文件里。举 例来说,我们可以像下面这样声明日志配置:

logging:
level:
root: INFO

spring:
profiles: development

logging:
level:
root: DEBUG

spring:
profiles: production

如你所见,这个application.yml文件分为三个部分,使用一组三个连字符(—)作为分隔符。 第二段和第三段分别为spring.profiles指定了一个值,这个值表示该部分配置应该应用在哪 个Profile里。另一方面,第一段并未指定spring.profiles,因此这里的属性对全部Profile都生效,或者对那些未设置该属性的激活Profile生效。active同样放在第一段中

3.3 定制应用程序错误页面

测试
本章内容 
集成测试 
在服务器里测试应用程序 
Spring Boot的测试辅助工具

要恰当地测试一个Web应用程序,你需要投入一些实际的HTTP请求,确认它能正确地处理 那些请求。幸运的是,Spring Boot开发者有两个可选的方案能实现这类测试。

Spring Mock MVC:能在一个近似真实的模拟Servlet容器里测试控制器,而不用实际启动 应用服务器。 
Web集成测试:在嵌入式Servlet容器(比如Tomcat或Jetty)里启动应用程序,在真正的应 用服务器里执行测试

Spring的Mock MVC框架模 拟了Spring MVC的很多功能。它几乎和运行在Servlet容器里的应用程序一样,

深入Actuator
本章内容 
Actuator Web端点 
调整Actuator 
通过shell连入运行中的应用程序 
保护Actuator

Actuator提供了三种获取端点的方式, REST请求, 远程shell, JMX监控

Actuator提供了13个端点,具体如表7-1所示。
表7-1 Actuator的端点
HTTP 方法 路径描述
GET /autoconfig 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过

GET /configprops 描述配置属性(包含默认值)如何注入Bean

GET /beans 描述应用程序上下文里全部的Bean,以及它们的关系

GET /dump 获取线程活动的快照

GET /env 获取全部环境属性

GET /env/{name} 根据名称获取特定的环境属性值

GET /health 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供

GET /info 获取应用程序的定制信息,这些信息由info打头的属性提供

GET /mappings 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系

GET /metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数

GET /metrics/{name} 报告指定名称的应用程序度量值

POST /shutdown 关闭应用程序,要求endpoints.shutdown.enabled设置为true

GET /trace 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等)

要启用Actuator的端点,只需在项目中引入Actuator的起步依赖即可。
对于Maven项目,引入的依赖是这样的:

org.springframework.boot
spring-boot-starter-actuator

表7-1中的端点可以分为三大类:配置端点、度量端点和其他端点

7.1.1 查看配置明细

获得Bean装配报告
要了解应用程序中Spring上下文的情况,重要的端点就是/beans。它会返回一个JSON文档, 描述上下文里每个Bean的情况,包括其Java类型以及注入的其他Bean

{
“bean”: “readingListController”,
“dependencies”: [
“readingListRepository”,
“amazonProperties” ],
“resource”: “URL [jar:file:/…/readinglist-0.0.1-SNAPSHOT.jar!
/readinglist/ReadingListController.class]”,
“scope”: “singleton”,
“type”: “readinglist.ReadingListController”}

所有的Bean条目都有五 类信息。 
bean:Spring应用程序上下文中的Bean名称或ID。 
resource:.class文件的物理位置,通常是一个URL,指向构建出的JAR文件。这会随着 应用程序的构建和运行方式发生变化。 
dependencies:当前Bean注入的Bean ID列表。 
scope:Bean的作用域(通常是单例,这也是默认作用域)。 
type:Bean的Java类型。

7.1.2 运行时度量
/metrics端点提供了 gc, 内存, 线程池, 会话, http 等资源使用的度量情况

/trace端点能报告所有Web请求的详细信息,包括请求方法、路径、时间戳以及请求和响应的 头信息

/health端点所提供的所有信息都是由一个或多个健康指示器提供的

更多端点详情请阅读springboot实战

7.4 定制Actuator
提供了自定义Actuator中端点的功能, 包括端点的id, 开启与禁用

Spring Boot开发者工具
Spring Boot 1.3引入了一组新的开发者工具,可以让你在开发时更方便地使用Spring Boot, 包括如下功能。 

自动重启:当Classpath里的文件发生变化时,自动重启运行中的应用程序。 
LiveReload支持:对资源的修改自动触发浏览器刷新。 
远程开发:远程部署时支持自动重启和LiveReload, 可以远程调试部署的代码
默认的开发时属性值:为一些属性提供有意义的默认开发时属性值。

在Maven POM里添加是这样的:

org.springframework.boot
spring-boot-devtools

Spring Boot起步依赖 详见附录B

application.properties中的配置属性 详见附录C

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值