代码来自于Spring Boot 2.0.4.RELEASE
SpringApplication类负责由main方法启动spring应用,文档中给出了启动的主要步骤:
- 创建ApplicationContext
- 处理命令行参数
- refresh ApplicationContext,加载bean
- 触发各类Runner
代码来自于Spring Boot 2.0.4.RELEASE
SpringApplication类负责由main方法启动spring应用,文档中给出了启动的主要步骤:
ConcurrentHashMap 的实现比较复杂,里面涉及到的内容很多,而且有很多的性能优化的策略,想全部搞清楚比较困难,所以主要对里面感兴趣的并发的处理方面,相关的几个函数的实现看下,难免有理解不到位的地方,以后随时修改补充吧。
这里看的是 java 7 中的实现。
另外,推荐一篇文章,写的很详细: The Concurrency Of ConcurrentHashMap
看了下 java 8 中 HashMap 的源码,结合网上一些文章,大概明白了 HashMap 中几个一直很疑惑的地方。这里就记录一下 HashMap 的学习。
HashMap 的数据结构“平平无奇”,就是我们熟悉的“数组+链表”的方式(链地址法),并且在链表长度超过某个值(默认为 8)后,将链表转换为红黑树以提高效率。
HashMap 存储数据的数组是:
1 | transient Node<K,V>[] table; |
也即一个 Node 数组,Node 实现 Entry 接口,每个 Node 存储一个键值对,如下:
1 | final int hash; |
其中,hash 是存储的 node 中的 key 的哈希值,key、value 即键和值,而 next 则显然是构建链表的,指向链表的下一个节点。
在 Spring Boot 中观察了一下有新的请求时,Servlet filter 的执行情况,做下记录。
Spring Boot 会按照 ApplicationFilterChain 中的数组 filters 里保存的 filter 按顺序执行,对于 OrderedFilter 可以指定 order 值(一个 int 值),值小的先执行,不指定 order 时按照首字母顺序执行。
默认情况下,有 CharacterEncodingFilter、HiddenHttpMethodFilter、FormContentFilter 和 RequestContextFilter,以及 webSocket 的 WsFilter。CharacterEncodingFilter、HiddenHttpMethodFilter、FormContentFilter 和 RequestContextFilter 都是使用了 Ordered***Filter 实例,order 值分别是 -2147483648、-10000、-9900 和 -105。
RequestContextFilter 主要用于使用第三方 Servlet 时的情况。关于 CharacterEncodingFilter、HiddenHttpMethodFilter 和 FormContentFilter,其作用可见如下。
项目打包时,直接用spring-boot maven plugin之类插件组装出一个包含了所有依赖的jar,即fat-jar的形式,可以直接启动,部署方便。但是并不是任何时候fat-jar都是最优解。
在项目开发中,依赖包我们期望是稳定的:版本的升级一定是审慎进行的,新依赖的加入也需要考量。也因此,在项目部署时,如果只打包源代码到一个thin-jar、将固定不变依赖包分离,打包得到的部署文件体积将大大减小——使用spring boot开发的项目打包成fat-jar百兆起步,但其实源代码打包的thin-jar体积很可能是KB级的。
尤其是在使用docker镜像部署jar时,对于镜像打包有优化:虽然对镜像体积减小不会有优化,但是可以将依赖文件置入单独的镜像层复用,镜像构建时多数情况下(依赖未变更的情况下)只需要重新构建源代码及它之上的层,构建速度将会得到提升。
对于正则表达式一向了解不多,假期期间随着《正则表达式必知必会》快速学习了一下正则表达式的基本使用,在此记录一下。
元字符 | 作用 |
---|---|
. | 换行符外任意字符 |
\d | 一个数字,等价于 [0-9] |
\D | 一个非数字,等价于 [^0-9] |
\w | 一个数字、字符及下划线,等价于[a-zA-Z0-9_](最后一个是下划线_) |
\W | 一个非数字、字符和下划线,等价于[^a-zA-Z0-9_](最后一个是下划线_),注意,[]内的 ^,对之后每个组合都取非,不只是紧接的 |
\s | 一个空白字符,等价于[\f\n\r\t\v ](最后有个空格),换页、换行、回车、制表、垂直制表符、空格 |
\S | 一个非空白字符,等价于[^\f\n\r\t\v ](最后有个空格) |
要注意,[]内出现的的元字符对应字符,不按照元字符处理,不需要要转义,如“.”、“$”等