紧接上面《
理解springboot那些注册与回调、监控与统计等命名规范,就可以读懂70%的springboot源代码》、《
理解springboot那些约定俗成的框架类名、全局context等命名规范,就可以读懂一半springboot的源代码》2篇文章,此片将汇总springboot那些过滤器与调用链、包装或封装、设计模式相关等命名规范,以便更加精进阅读springboot源代码
过滤器与调用链
Pipeline:
流管道,用在流数据处理中。
如:Springboot下redis用pipelining管道模式写入,使写入性能更佳!
引入pipelining,与传统模式对比
compile('redis.clients:jedis:2.9.0') #gradle引入
compile('org.springframework.data:spring-data-redis:2.0.8.RELEASE')
测试代码:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
public class BatchOperSet {
private static final String HOST = "127.0.0.1";
private static final int PORT = 6379;
// 批量插入数据到Redis,正常使用
public static void batchSetNotUsePipeline() throws Exception {
Jedis jedis = new Jedis(HOST, PORT);
String keyPrefix = "normal";
long begin = System.currentTimeMillis();
for (int i = 1; i < 10000; i++) {
String key = keyPrefix + "_" + i;
String value = String.valueOf(i);
jedis.set(key, value);
}
jedis.close();
long end = System.currentTimeMillis();
System.out.println("not use pipeline batch set total time:" + (end - begin));
}
// 批量插入数据到Redis,使用Pipeline
public static void batchSetUsePipeline() throws Exception {
Jedis jedis = new Jedis(HOST, PORT);
Pipeline pipelined = jedis.pipelined();
String keyPrefix = "pipeline";
long begin = System.currentTimeMillis();
for (int i = 1; i < 10000; i++) {
String key = keyPrefix + "_" + i;
String value = String.valueOf(i);
pipelined.set(key, value);
}
pipelined.sync();
jedis.close();
long end = System.currentTimeMillis();
System.out.println("use pipeline batch set total time:" + (end - begin));
}
public static void main(String[] args) {
try {
batchSetNotUsePipeline();
batchSetUsePipeline();
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试结果:
not use pipeline batch get total time:2990
use pipeline batch get total time:41
参考案例:Springboot下redis写入pipelining管道模式性能调优实例
- 参考案例:Springboot下redis写入pipelining管道模式性能调优实例
- PipelineContext.java
Chain:
链条,一般用在责任链模式中。
责任链模式(Chain of responsibility pattern)可以为某个请求创建一个对象链,每个对象依序检查此请求并对其进行处理或者将它传给链中的下一个对象。
责任链模式,是一种实用性非常强的设计模式,比较典型的应用场景有:
- Apache Tomcat 对 Encoding 编码处理的处理
- SpringBoot ⾥⾯的拦截器、过滤器链
- netty 中的处理链
- 支付风控的机制
- ⽇志处理级别
通过注解@Order
来指定排序,代替手动方法排序sort()
/**
* 指定注入顺序为1
*
*/
@Order(1)
@Component
public c