SpringBoot异常处理
统一异常处理
http://www.gxitsky.com/2019/01/30/springboot-app-38-global-exception-handle/
http://www.zhaojun.im/springboot-exception/
https://www.jianshu.com/p/9792846ee029
https://www.cnblogs.com/harrychinese/p/SpringBoot_exception_handler_best_practice.html
SpringSecurity
解决SpringSecurity手动退出登录后再次登录成功会重定向到登录界面的问题(https://www.jianshu.com/p/4a5061951c77)
.and().logoutSuccessUrl("/")
设置session超时退出(https://www.cnblogs.com/zyly/p/12316099.html)
server.servlet.session.timeout=1800
//session管理,失效后跳转
http.sessionManagement().invalidSessionUrl("/login");
SpringBoot中SpringSecurity 中不能抛出异常UserNameNotFoundException 问题解析与处理
https://juejin.im/post/5c432efce51d4551e653a77e
https://www.jianshu.com/p/4a7654fa0bd3
https://blog.csdn.net/sun1021873926/article/detai ...
thymeleaf
判断对象是否为空
使用 ${xxx?.xxx?} 可以判断对象是否为空,? 号 前的对象或者属性为空那么就不再进行渲染,而且不会导致出现报错的情况
idea热加载配置
热加载方式
JRebel 收费,有点贵
Spring-Loader 不稳定
DCEVM+Hotswap Agent 免费(当然选择这种)
DCEVM+Hotswap Agent下载DCEVMlatest release of DCEVM Java patch
sudo java -jar DCEVM-8u181-installer-build2.jar
选择jdk安装目录,并点击”Install DCEVM as altjvm”按钮
下载Hotswap agent jarlatest release of Hotswap agent jar
放到任意目录
安装idea插件 HotSwapAgent
配置插件
以debug模式启动应用程序
测试修改代码或者添加新方法,点击编译
更多信息DCEVM & HotswapAgent参考https://github.com/dmitry-zhuravlev/hotswap-agent-intellij-plugin
java8学习
函数式
函数式接口就是只定义一个抽象方法的接口
函数式接口的抽象方法的签名称为函数描述符。
Predicate:java.util.function.Predicate接口定义了一个名叫test的抽象方法,它接受泛型T对象,并返回一个boolean。
Consumer:java.util.function.Consumer接口定义了一个名叫accept的抽象方法,它接受泛型T的对象,没有返回(void)。
Function:java.util.function.Function<T, R>接口定义了一个叫作apply的抽象方法,它接受泛型T的对象,并返回一个泛型R的对象。
DoublePredicate、IntConsumer、LongBinaryOperator、IntFunction、ToIntFunction、IntToDoubleFunction
流常用方法
filter 筛选
distinct 去重 (据流所生成元素的hashCode和equals方法实现)
切片
takeWhile 遭遇第一个不符合要求的元素时停止处理
dropWhile 它会从 ...
python学习
if__name__=='__main__'
在学习Python基础语法的时候,在程序最后经常会遇到这句话,这里简单解释下它的意义。总地来说,这句代码的作用是既能保证当前的.py文件直接运行,也能保证其可以作为模块被其他.py文件导入。
def getName():
print(__name__)
if __name__ == '__main__':
getName()
//输出__main__
这说明,__name__本身是一个变量,但它不是一般的变量。实际上,它是在程序执行前就创建并赋值的,而赋值的机制是这里的关键。在当前程序被当作主程序被执行的时候,__name__自动被赋值为固定的字符串__main__;当它作为模块被其他文件调用的时候,自动被赋值为模块所在的文件名。
java8时间API
Java8之前的日期时间API表示时刻信息的 DateDate的设计饱受诟病,其缺陷包括但不限于:
类名误导,该类实际上不仅反映日期,还反映时间
方法名误导,getDate()返回日期中的天,getDay()返回的是周几
年份是与1900年的差值,可读性极差
月份是从0计数的,可读性极差
周几是相对于周日的差值,可读性极差
不提供时区设置,内部总是使用本地时区
不提供历法设置,内部使用格里历或儒略历
不提供格式化的转换,从字符串中解析日期时相当难用
参数返回太随意,比如设置1月33日,实际是2月2日
存在同名类,java.sql包下依然有一个作用相同的Date类
该类允许扩展,实际上,应当把日期-时间类设计为不可变的final类
当前定位Date 的目前定位是,唯一表示一个时刻,现在的 Date 类中接近百分之八十的方法都已废弃,被标记为 @Deprecated。还有几个为数不多没有被废弃的方法:
public long getTime() :返回内部存储的毫秒数
public void setTime(long time):重新设置内存的毫秒数
public boolean ...
ideaVim安装配置
安装和安装其它插件一样,直接在插件市场搜索ideaVim安装即可。
配置快捷键设置ideaViim键与idea快捷键有冲突,可以在Editor Vim Emulation设置,我的快捷键设置如下:
常用快捷键
zo:打开折叠
zc:关闭折叠
.ideavim配置文件讲解逻辑开发过idea插件的人都知道,在idea中,任何目录选项上的点击操作,工具栏上的按钮都会被映射为一个action。即点击对应的按钮或者选项,执行相应的action。理解很简单,这就是MVC的思想,比如springmvc, 一个访问路径映射为一个控制器中的方法这样子。
明白action映射这一点很重要。因为ideavim的插件支持使用vim命令执行对应的action。所以,这个设计逻辑就打通了vim和idea的交互,使得我们可以在vim中完成所有和idea相关的操作。
常规操作vim的定位是文本编辑。所以在idea中一般情况下vim快捷键和命令生效的基本条件就是当前窗口焦点在编辑区。这是最基础的条件,如果你当前的快键键在Project或者Run这些侧边栏中,按vim的命令肯定是不会生效的。
明白了基本条件,那我 ...
ELK安装配置
ELK常见架构Elasticsearch + Logstash + Kibana这是一种最简单的架构。这种架构,通过logstash收集日志,Elasticsearch分析日志,然后在Kibana(web界面)中展示。这种架构虽然是官网介绍里的方式,但是往往在生产中很少使用。
Elasticsearch + Logstash + filebeat + Kibana与上一种架构相比,这种架构增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,用来部署在客户端,优势是消耗非常少的资源(较logstash), 所以生产中,往往会采取这种架构方式,但是这种架构有一个缺点,当logstash出现故障, 会造成日志的丢失。
Elasticsearch + Logstash + filebeat + redis(也可以是其他中间件,比如kafka) + Kibana这种架构是上面那个架构的完善版,通过增加中间件,来避免数据的丢失。当Logstash出现故障,日志还是存在中间件中,当Logstash再次启动,则会读取中间件中积压的日志。
filebeat安装部署
简介Fil ...
类图
集合类图
线程
IO字节输入流
FilterInputStream剖析这个类的特殊之处,就是包含了一个InputStream,使得可以在这个InputStream基础上进行多种封装,从而达到装饰的目的。
装饰者模式,顾名思义,是对原有类进行了一定的装饰,装饰后的类必须和原有的类拥有相同的方法,当然,可以在原有类的基础上进行扩展。
这里的装饰者模式通过包含一个原有的Inputstream对象,并且将InputStream原有的方法或直接暴露,或进行装饰后暴露,又或者添加了新的特性,如DataInputStream中的readInt(),BufferedInputStream中的缓存功能。
为什么InputStream选择装饰者模式,而非直接继承的方法来扩展,这就是装饰者模式VS继承。如果单纯的使用继承,就会造成类的“爆炸”式增长。
直接使用继承,可以实现“目的”和“方法”,但是每一种来源的输入流,都需要改善流读取方法,因此在使用继承时,每一个InputStream的子类都需要DataInputStream,BufferedInputStream这几个类提供的“装饰作用”的功能,因此 ...
jvm性能监控与调优
jvm参数类型
标准参数(jvm各个版本基本不变)
```shell-help-server-client-version-cp-classpath
* X参数(非标准化参数,变化比较小)
* ```shell
-Xint 解释执行
-Xcomp 第一次使用就编译成本地代码
-Xmixed 混合模式,JVM自己来决定是否编译成本地代码
XX参数(用的比较多,主要用来JVM调优和debug)
Boolean类型
格式:-XX:[+-]表示启用或者禁用name属性
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
非Boolean类型
格式:-XX:= 表示name属性的值是value
-XX:MaxGCPauseMillis=500
XX:GCTimeRatio=19
#-Xms -Xmx 属于XX参数
-Xms 等价于 -XX:InitialHeapSize
-Xmx 等价于 -XX:MaxHeapSize
查看jvm运行时参数
`` ...
hexo使用总结
自定义域名
添加一条域名解析记录
在hexo的source文件夹中添加CNAME文件,内容为自己的域名
修改新建文章模版模版路径为hexo/scaffolds/post.md