自定义通用异常处理
生产级别的通用异常处理所有的异常都抛出,统一在表现层处理,其余直接抛出就好。 spring定义的错误响应方式如图所示。 使用Java提供的异常类抛出的时候只可以传递string,所以需要自定义一个异常类,继承RuntimeException,抛出的时候同时包含信息和状态码 新建通用异常处理类相当于aop里面的通知,起到拦截的作用,要做到通用,状态码不可以写死,这里的设计不对,后面会改进 src/main/java/com/deltaqin/common/advice/CommonExceptionHandler.java 12345678910111213141516171819package com.deltaqin.common.advice;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annot...
装饰者模式Decorator
简单版防止类爆炸 类继承是会造成耦合度很高 用聚合代替继承,和代理不一样的是主动权在谁手里,聚合是主动的,自己知道的,代理是被动,自己甚至不知道 Component:抽象被装饰组件,定义都有哪些功能。 ConcreteComponent:抽象被装饰组件实现类 Decorator:抽象****装饰器,不一定是接口,它持有一个Component对象实例的引用,定义一个与抽象被装饰组件一致的接口; ConcreteDecorator:具体****装饰器,负责实现装饰器角色定义的功能。 详细版我们在做一个产品的时候,可能并没有考虑到新需求的场景,此时就需要为某些组件添加新的功能来满足这些需求。 如果要符合开放-封闭的原则,我们最好不要直接修改已有的具体实现类,因为会破坏其已有的稳定性。 继承,在某些场景下是不可行的,例如,要覆盖的方法被 final 关键字修饰了,那么在 Java 的语法中就无法被覆盖。使用继承方案的另一个缺点就是整个继承树的膨胀,例如,当新需求存在多种排列组合或是复杂的判断时,那就需要写非常多的子类实现。 应该尽量多地使用组合方式进行扩展,尽量少使用继承方式进行扩...
观察者模式Observer
观察者接口:Observer接口、Listener接口、Hook、Callback 具体观察者:实现Observer接口 事件类 :不仅仅包含时间,事件,还包含事件源。这样观察者拿到事件知道是谁发的才可以做有区别的处理 事件源对象:被观察者Object, 事件源对象,新建事件对象。事件源自己会维护很多监听器。可以调用监听器接口的方法, **事件对象 **穿过 Observer的链条 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485package com.deltaqin.designPattern.d09_observer;import java.util.ArrayList;import java.util.List;/** * @author deltaqin * @date 2021/3/27 12...
计算机系统数据表示
计算机里面的基本单位有哪些? 位:bit,二进制数(binary digit)的英文缩写 字节:Byte,8位 字:计算机的字由两个或多个相邻字节构成,处理器访问和处理的时候是按照字为单位进行,即这些字节被当做一个整体处理。字的大小(Word size)表示特定架构有效处理的数据最大大小,常见大小有16位32位64位。 比如16位可以表示的有符号位的最大整数是32767,32位可以表示的无符号位最大整数4294967295即232即内存大小限制4G,毕竟是要寻址的,再大无法表示地址。 32位操作系统int类型的最大值是 2147483647。 在32位操作系统下int类型取值范围如下: Int32 //等于int, 占4个字节(-2147483648~2147483647) 半字节:8位字节可以对半分为两个4位,称为半字节, 低半字节、高半字节:包含最小值二进制数字的半字节称为低半字节,另外半个字节为高半字节。 按位计数系统是什么?positional numbering systems 数字的值可以通过增加基数(基或底radix)的幂来表示,也叫做...
计网思维导图总结
计网思维导图总结内容较多,浏览器建议使用大纲查看。 processon
设计模式、设计原则、重构与编码规范(设计模式之美笔记)
设计模式要干的事情就是对复杂解耦。利用更好的代码结构将一大坨代码拆分成职责更单一的小类,让其满足高内聚低耦合等特性。 创建型模式是将创建和使用代码解耦,结构型模式是将不同的功能代码解耦,行为型模式是将不同的行为代码解耦。 而解耦的主要目的是应对代码的复杂性。设计模式就是为了解决复杂代码问题而产生的。 为什么设计模式? 面试会问 提高复杂代码的设计和开发能力。避免只是框架用的溜。 如何分层、分模块、分类 每个类应该有哪些属性和方法 怎么设计类之间的交互,用继承还是组合 使用接口还是抽象类,怎么做到解耦、高内聚和低耦合 该用单例模式还是静态方法 用工厂模式创建对象还是直接new出来 如何避免使用了设计模式提高扩展性的同时降低了可读性 告别写被人吐槽的烂代码,团队里面的代码标杆,不经意间写出来的代码,都能作为同事学习、临摹的范例。 读源码的时候根据设计模式推测作者的思路,做到事半功倍。 如何评价代码质量的好坏?即使一段代码的可扩展性很好,但可读性很差,那我们也不能说这段代码质量高。常见的评价指标: 可维护性:分层清晰、模块化好、高内聚低耦合、遵从基于接口而非实现编程的设...
访问者Visitor
在结构不变的情况下动态改变内部元素的动作 适合用在接口结构基本固定不变的 实现案例123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116package com.deltaqin.designPattern.d04_visitor;// 根据不同的访问者访问的不同商品,给不同的价格// 计算的规则定义在访问者上面,不同访问者对从商品获得的相同的信息实现自己的逻辑// 同一个被访问者传递给不同访问者的消息是一样的。public class Computer { ComputerPart cpu = new CPU(); ComputerPar...
读取了Request输入流,请求数据就不见了
HttpServletRequest 和 HttpServletResponse 中存在方法互斥。 在过滤器、拦截器中对 HTTP 请求中的数据做校验、审计是非常常见的需求 Request 输入流数据一但被读取,Controller找不到了Request 的 getlnputStream 和 getReader 都只能使用一次 请求数据解析工具: 定义拦截器: 发起请求: Request的 getlnputStream、 getReader、 getParameter 方法互斥,也就是使用了其中一个,再使用另外的两个,是获取不到数据的。 Response 也是一样的,与 Request 几乎是一样的 互斥效果的原理: getParameter 内部也会判断: 无法重复读取的原理读取完坐标没有重置: getReader 也是没有重置坐标 HttpServletRequestWrapper + Filter 解决输入流不能重复读取问题其实是包装器模式,实现对请求数据的包装。 自定义请求包装器: 每次获取数据的时候都是重新从数组里面获取 这个方法直接调用上面重写的 g...
责任链模式ChainofResponsibility
简单实现–实现链式调用以及调用链中断1234567891011121314151617interface Filter { boolean doFilter(Msg m);}class HTMLFilter implements Filter { @Override public boolean doFilter(Msg m) { String r = m.getMsg(); r = r.replace('<', '['); r = r.replace('>', ']'); m.setMsg(r); return true; }}// ... 其他具体的过滤器实现类 调用链也实现Filter接口,是为了可以两个链子连起来。也就是说把后面的链子当做过滤器的**List的最后一个元素。利用了多态,都实现了doFilter,但是具体的过滤器是...
软中断softirq的CPU使用率升高
中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。中断其实是一种异步的事件处理机制,可以提高系统的并发处理能 力。 由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中 断处理程序就需要尽可能快地运行。 中断处理程序在响应中断时,还会临时关闭中断。这就会导致上一次中断处理完成 之前,其他中断都不能响应,也就是说中断有可能会丢失。 为什么有硬中断和软中断区分?为了解 决中断处理程序执行过长和中断丢失的问题,****Linux 将中断处理过程分成了两个阶段,也就 是上半部和下半部: 上半部直接处理硬件请求, 硬中断,特点是快速执行; 网卡接收到数据包后: 会通过**硬件中断**的方式,通知内核有新的数据到了。 同时把网卡的数据读到内存中,然后更新一下**硬件寄存器的状态(表示数据已经读好了),最后再发送一个软中断信号**,通知下半部做进一步 的处理。 硬中断是硬件产生的,比如键盘、鼠标的输入,硬盘的写入读取、网 卡有数据了; 下半部则是由内核触发, 软中断,特点是延迟执行。通...