IDEA 查看 UML 类图
一、基础使用
查看类图功能特别是对于刚接手一个新系统时,对于系统的熟悉起到辅助作用,本文介绍下 IDEA 的 Diagrams 功能,希望对您能有所帮助。
1.1 查看类图
IDEA 的 Diagrams 功能使用起来非常简单,在你想要生成类图的类中右击选择 Diagrams 即可。
如上图所示,该功能有两个子选项,这两个选项的区别就是前者将类图渲染在一个新标签页中,而后者则是在当前页以浮窗的形式展示。除了在类中右键点击以外,在目录树中右键点击也是同样的效果,然后你就会得到一幅类图。
1.2 类图含义
在上图中,类名前面的符号含义,比较明显。C 表示该类是一个普通类,I 则表示该类是一个接口,@ 表示该类是一个注解。符号后面的绿色的解锁状态表明该类是 public 修饰。
上图中几种线的含义和 UML 规范基本相同,三角箭头的实线表示二者的泛化(Generalization)关系,在 Java 中的体现就是 extend,箭头所指的类就是父类。
12345public class WebSecurityConfigurerAdapter {}public ...
Git 多用户配置
一、引言
一般来说,安装好 git 后,我们都会配置一个全局的 config 信息,就像这样:
12git config --global user.name "jitwxs" // 配置全局用户名,如 Github 上注册的用户名git config --global user.email "jitwxs@foxmail.com" // 配置全局邮箱,如 Github 上配置的邮箱
但是你可能会碰到需要在一台电脑上配置多个用户信息的需求。此时就不能够用一个全局配置搞定一切了。
比如因为我的个人电脑出了问题,我想要提交我的个人项目时,只能用公司配的电脑去提交。而公司的电脑配置的是私有的 gitlab 仓库,而我自己的项目存储在 github 上。这两个仓库不仅仓库地址不一样,仓库的用户名和邮箱都不一样。
二、配置多用户
本文将配置分别是 github 以及 gitlab 上的两个用户,并分别在它们所属的项目上进行 git 操作,这差不多就是配置多用户的大部分操作了。
GITHUB
GITLAB
用户名
jitwxs
lemon ...
Git 修改已经被覆盖的提交
如果你不想看详细的描述,直接看步骤即可:
1.git rebase -i HEAD~n,将要修改的提交状态改为 edit
2.修改文件
3.git add
4.git commit --amend
5.git rebase --continue
假设我们目录下有三个文件,分别是 digit.dat 、letter.dat和symbol.dat,digit.dat 中存放着数字,letter.dat 中存放着字母,symbol.dat 中存放着符号。
我们先提交 digit.dat,然后提交 letter.dat,最后提交 symbol.dat:
此时我们想起来,letter.dat 中仅仅存放了小写字母,大写字母被遗忘了,我们要把大写字母补充进去。这时候有两种解决方法:
修改 letter.dat 内容,并发起一次新提交
不发起新提交,对之前的那次提交做修改
我们不讨论发起新提交的情况,仅仅讨论如何对那次提交做修改。你也许会说,这很简单啊,直接使用命令 reset HEAD^ 或者 reset 8cc5dc 不就好了吗?
不错,这没有问题,但是这样的话我们对symbol ...
Git Submodule 使用技巧
有的时候我们会遇到仓库嵌套的问题,即一个 Git 仓库内部还有一个 Git 仓库,这里我们可以使用 Git 的模块化。
现在我拥有一个 git 项目 blog,它的内部有一个博客主题,名为 hexo-theme-icarus,这也是一个 git 项目,这里就可以把这个主题项目作为模块引入进来。
为了方便命令介绍,先大致画一下目录结构:
12345- blog(博客项目) - aaa - bbb - theme - hexo-theme-icarus(主题项目)
Step1: 首先进入 theme 目录下,将 hexo-theme-icarus clone 下来,这里已经完成了。
Step2: 然后就是把它加入到模块中,在 theme 目录下:
12345wxs@wxs-PC MINGW32 ~/Documents/GitHub/blog/themes (master)$ git submodule add https://github.com/jitwxs/hexo-theme-icarus.git hexo-theme-icarus/Adding ex ...
SpringBoot 集成 Spring Security(9)——解决 UserNotFoundException 不抛出问题
一、前言
《SpringBoot 集成 Spring Security》系列文章,原本只是我自己学习后写的笔记,没想到受到大家的欢迎,能够对大家带来帮助,让我感到十分高兴。但说起来我也只是初学者,这一系列文章中可能也存在错误,本文是为了解决 UserNotFoundException 这个异常无法抛出而写出。
这个问题大致是这样的,我们知道 Spring Security 的验证处理是由某个 Provider 处理的,在 Provider 中通过对应的 UserDetailsService 的 loadUserByUsername() 来决定如何加载数据库中的用户信息。
以 《SpringBoot集成Spring Security(3)——异常处理》 代码为例,采用默认的用户名密码登陆方式,我们在 CustomUserDetailsService 类中,有这么一行代码:
12345678910@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException ...
老司机教你如何写出没人敢维护的代码!
今天公众号给我推送了一篇关于编程规范的文章,很有趣。虽然举的例子比较极端,但是编程规范还是值得重视的,抱着有则改之,无则加勉的态度,大家一起乐呵乐呵。
引言
编写除了自己没人能看懂的代码,是一种怎样的体验?
下面由作为资深挖坑程序员的我,手把手教大家这是怎么做到的?如果各位可以在接下来的时间多加练习,所谓青出于蓝胜于蓝,相信各位不但可以写出别人无法维护的代码,还可能在有朝一日,甚至能技艺炉火纯青地写出自己都维护不了的代码。
编写无法维护的代码说难其实并不难,核心要点就是和编码规范反其道而行之,如果在此基础上再添加一些自己琢磨出的心得的话那就更加完美了。
掌握了这个要点还不够,还要注意一个原则:不要让我们的代码一眼看上去就无法维护,格式之类的还是要注意些的,我们要追求的不是这种肤浅的表面上的无法维护,我们要的是实质是无法维护的。
要是别人一眼就能看出你的代码无法维护,那你的代码就存在需要重写或者重构的风险了,那不成了前功尽弃亲者痛,仇者快的事情了嘛。
了解清常规编程的思维方式再下手!
《孙子兵法》有云“知己知彼,百战不殆”,假如我们要想从心理上彻底击败后续的代码维护人员,我们必须 ...
彻底搞定 Java 参数传递问题
一、引言
在开始正文前照例扯扯闲话,说说这篇文章的来源把。今天同事在处理一个 BUG 时产生了疑问,代码类似这样:
12345678910public static void main(String[] args) { User user = null; func(user); String name = user.getName();}public static void func(User user) { user = getUser2(); ...}
当程序运行时,user.getName() 执行抛出 NPE,这是一个典型的关于 Java 是值传递还是引用传递的问题。
特别是有 C 语言的同学,在对 Java 基础掌握不是很牢的情况下,可能就会想当然的认为传递的是一个引用(指针),方法内部的属性改变会影响方法外。
当同事一开始让我看得时候,我也被绕了,这就说明自己基础掌握不牢固啊。故写下这篇文章,将这类问题一劳永逸的解决掉。
二、值传递还是引用传递?
在正式开始之前,我们必须得明确 Java 中形参的传递 ...
Redis 初探(9)——缓存问题
一、引言
咳咳,这一节内容应该早就放上博客的,一直忘记了,在写上一篇《详解布隆过滤器》时,谈到缓存问题,一看博客中竟然没有写过相关的,实在是不该,特此补上。
Redis 所存在的缓存问题也是大部分缓存所存在的问题,因此本文不单单特指于 Redis。这些问题包括缓存穿透、缓存雪崩、缓存击穿、缓存预热等等,相关文章网络上已经数不胜数了,说实话本文和它们没啥不同之处,只是为了记录,所以对于了解过的人基本就是废话了,谨慎阅读哦。
二、缓存穿透
问题描述:
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的 key 频繁攻击我们的应用,这就是漏洞。
解决方案:
有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被 这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。
另外也有一个更为简单粗暴的 ...
详解布隆过滤器
一、引言
假设我们想要开发一个邮件系统,那么如何实现垃圾邮件的过滤呢。
最简单的办法就是把确定为是垃圾邮件的地址都保存起来,存入黑名单中。当用户接收到黑名单地址的邮件时,直接将邮件归类到垃圾箱中。
垃圾邮件的地址数量可能是巨大的,因此除了被存储在数据库中,程序实际使用的时候一定是需要借助缓存的。不论是使用本地缓存还是内存缓存,当数据量达到一定数量级时,都是不太合适的。
咳咳,如果你的数量级连百万都不到的话,那么其实布隆过滤器好像用处不大哈,缓存+容错处理似乎就能解决了。
假设存在 1000W 个垃圾邮件地址,每个地址就按 10 个字节来算,内存占用就已经达到 100MB 了。如果地址扩大到1亿个呢,内存占用就达到 1GB 了。
所以你是用 HashMap 还是用 Redis 的 Set 结构,亦或者其他来存储,可能都不太合适了。
二、布隆过滤器
2.1 基本特点
布隆过滤器(Bloom Filter),它的特点是:当它说某个 key 不存在时,key一定不存在;当它说某个 key 存在时,key 可能存在。
上面提到的只是一个为了引出布隆过滤器的例子,可能不太严谨。布隆过滤 ...
Java 设计模式——观察者模式
一、前言
好久没更新设计模式系列了,这周闲来无事,就水一把,介绍个简单的——观察者模式。
所谓观察者模式,本质是就是发布与订阅,在日常生活中发布/订阅的例子有很多,比如大家微信里面的公众号,你可以订阅微信公众号,公众号发布文章后,微信会将文章推送给你。。。
二、发布 / 订阅
在上面提到的公众号的例子,就是一个观察者模式。
你作为一名普通用户就是观察者,你可以关注或者取关公众号,当公众号发布消息时,你会收到消息推送。
公众号运营者就是消息的发布者,即被观察者,当用户关注你时,你需要将用户添加到你的推送列表中;同理,当用户取关时,你要把他从推送列表中移除(当然真实情况这是微信平台处理的)。当你发布消息时,应该告知所有关注了你的用户。
2.1 耦合实现
先定义公众号类,内部 users 集合保存所有关注该公众号的用户,addUser() 和 removeUser() 方法分别表示关注和取关,pushMessage() 方法表示发布新消息。
微信公众号类1234567891011121314151617181920212223public class WeChatPublicAccou ...