在之前我们分析SpringBoot的自动化配置原理的时候,分析了freemarker的自动化配置类FreeMarkerAutoConfiguration,这个自动化配置类需要classloader中的一些类需要存在并且在其他的一些配置类之后进行加载。
但是还存在一些自动化配置类,它们需要在使用一些注解开关的情况下才会生效。比如spring-boot-starter-batch里的@EnableBatchProcessing注解、@EnableCaching等。
分享技术和生活
在之前我们分析SpringBoot的自动化配置原理的时候,分析了freemarker的自动化配置类FreeMarkerAutoConfiguration,这个自动化配置类需要classloader中的一些类需要存在并且在其他的一些配置类之后进行加载。
但是还存在一些自动化配置类,它们需要在使用一些注解开关的情况下才会生效。比如spring-boot-starter-batch里的@EnableBatchProcessing注解、@EnableCaching等。
SpringBatch是spring框架下的一个子模块,用于处理批处理的批次框架。
本文主要分析SpringBatch中的retry和skip机制的实现。
先简单说明下SpringBatch在SpringBoot中的使用。
如果要在springboot中使用batch的话,直接加入以下依赖即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
然后使用注解开启Batch模块:
...
@EnableBatchProcessing
public class Application { ... }
之后就可以注入JobBuilderFactory和StepBuilderFactory:
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
有了这2个factory之后,就可以build job。
Java Annotation对应的Retention有3种,在RetentionPolicy中定义,有3种:
Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
在SpringBoot中要使用Swagger的话,可以使用springfox。
在sbt中添加依赖即可:
libraryDependencies += "io.springfox" % "springfox-swagger2" % "2.6.0"
libraryDependencies += "io.springfox" % "springfox-swagger-ui" % "2.6.0"
查看springfox-swagger2中的源码,发现springfox并不是通过autoconfigure实现和swagger的整合的,而是基于Spring的方式Import各种bean构造Swagger。
所以本文指的Swagger在SpringBoot中的使用同样也可以在Spring中使用。
Springboot内部提供的事务管理器是根据autoconfigure来进行决定的。
比如当使用jpa的时候,也就是pom中加入了spring-boot-starter-data-jpa这个starter之后(之前我们分析过springboot的自动化配置原理)。
Springboot会构造一个JpaTransactionManager这个事务管理器。
而当我们使用spring-boot-starter-jdbc的时候,构造的事务管理器则是DataSourceTransactionManager。
这2个事务管理器都实现了spring中提供的PlatformTransactionManager接口,这个接口是spring的事务核心接口。
这个核心接口有以下这几个常用的实现策略:
具体的PlatformTransactionManager继承关系如下:
我们在编写完Netty程序之后,会需要进行ChannelHandler的一些测试。
在初学Netty的时候,我们都是直接起一个Server,然后再写一个Client去连接Server,看传输的数据和接收到的数据是否正确。
在Netty in Action书中的Transport和Unit-test your code这两章就提出了可以使用EmbeddedChannel进行ChanndlHandler的单元测试。
Netty内部提供的Codec用于处理消息的编解码问题,比如Http,Ftp,SMTP这些协议,都需要进行编解码。
Netty内部直接提供了Http协议的Codec组件用于编解码Http协议。
在开发过程中,有时候我们需要构建一些适应自己业务的应用层协议,Netty可以很方便地实现自定义协议。
比如我们的自定义协议CucstomProtocol结构如下:
| version | header | content |
其中version表示版本号,long类型;header是一个uuid,string类型,content则是具体的内容,string类型。
主要记录ChannelHandler、Codec以及Bootstrap的作用,还有Netty内置的一些ChannelHandler、Codec,以及Bootstrap的分类。
一篇读书笔记,根据章节进行下总结。已经看了5章,先对这5个章节做个小总结。
springboot内部提供了一个模块spring-boot-actuator用于监控和管理springboot应用。
这个模块内部提供了很多功能,endpoint就是其中一块功能。
我们在sbt中加入这个模块的依赖:
libraryDependencies += "org.springframework.boot" % "spring-boot-starter-actuator" % "1.3.5.RELEASE"
然后启动项目,访问地址 http://localhost:8080/health,看到以下页面:
{
status: "UP",
diskSpace: {
status: "UP",
total: 249779191808,
free: 22231089152,
threshold: 10485760
},
db: {
status: "UP",
database: "H2",
hello: 1
}
}