自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 关于如何书写稳定业务代码的思考

大型软件安装的时候,都会分步完成,首先会检测环境,必要的依赖是不是已经安装,然后在一步一步安装子模块,如果哪个模块失败了,则会提醒用户处理,处理完了再重新打开安装程序,则会从失败的模块继续安装。受次启发,感觉我们的业务,也可以如此实现。一个业务往往由多个子业务(本地或分布式)组成,每个子业务都有可能失败,最终导致业务失败。如何在失败后快速、正确的恢复业务是本文讨论的内容。对于一个业务,应该提供三个接口,主接口,执行中处理接口,查询结果接口。

2024-07-19 14:13:32 414

原创 服务应具备的特性思考

保护应用服务及其相关数据的机密性、完整性和可用性,防止未经授权的访问、使用、披露、修改或破坏。能够以相对简单、高效和低成本的方式进行维护、修复和改进。能够长时间稳定运行,或在出现故障时能够很快恢复。可以轻松的通过拓展服务数量来增强服务能力。对于有状态应用,要保证各节点数据一致。

2024-07-18 10:26:35 205

原创 编码经验杂记

页面防止重复提交–> 页面表单验证–>展示loading图–>网络通信问题反馈处理 -->后台防止重复提交–> 后台数据验证–>后台业务处理–>保存数据(处里空格等)–>日志记录错误的详细信息–>展示详细处理结果和说明–>页面根据处理结果引导客户进行业务跳转。拆分服务的界限的一个考量就是可能的访问数量,像c端访问量通常远远大于b端,所以应该把c端,b端分开。友好的表单业务的完整流程。

2024-02-23 10:08:59 403

原创 vue2 项目 vscode 配置

文件-> 首先项->配置文件->显示内容/创建配置文件->打开或创settings.json,内容如下。(如果失败则直接编辑系统中的settings.json文件)在安装目录新建 node_cache 和 node_global 两个文件夹,并将node_global路径加入Path环境变量。新建或修改jsconfig.json文件(解决路径问题)下载 vs code。

2024-02-22 15:40:34 1053

原创 es6~ 常用语法总结

【代码】es6~ 常用语法总结。6. 引入了Map和Set对象 7. n次方操作符:**,eg. 2\*\*3=88. Array.includes:是否包含某元素9. async、await

2024-02-22 15:30:25 1106

原创 常见流程代码审查

1. 字符串转其他类型时,要处理转换异常2. 禁止空指针异常2. 依赖于先前值得更新要处理并发情况(分布式锁或消息队列处理)3. 要处理数据库无法存储的特殊字符4. 小数计算要用BigDecimal5. else 部分必须处理(哪怕只打印debug日志)6. 接口要保证幂等7. 耗时接口要限制调用频率8. 循环中禁止单记录查询9. 批量保存要写在事务中10. 禁止sql子查询11. 禁止sql超过3个表的关联12. 禁止在事务中处理耗时操作(事务中调用外部接口)13. 获取大量数据

2024-02-21 13:18:53 441

原创 浅谈vue响应式

要想做到上述功能需要具备两个条件 + 属性的写入和读取必须可以被拦截(被vue管理) + 属性必须在**回调函数或watch函数中被读取**,这样才能记录属性之后被

2024-01-12 11:19:16 499

原创 el-form 初值和resetFields问题

给dataForm动态赋初值,必须如下,用 this.dataForm={}这种方式,其他的形式如 this.dataForm.属性、this.dataForm[属性] 都会失败且造成 el-form和resetFields 出现问题。

2023-07-19 10:13:39 481 1

原创 js 杂记

这样,对于内容动态增加并且子节点都需要相同的事件处理函数的情况,可以把事件注册上提到父节点上,这样就不需要为每个子节点注册事件监听了。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,但是,如果改变了块级作用域内声明的函数的处理规则,显然会对老代码产生很大影响。为了减轻因此产生的不兼容问题,ES6 在附录 B里面规定,浏览器的实现可以不遵守上面的规定,有自己的行为方式。this,谁调用的指向就是谁,这个“谁"可以是任何定义(在内存中一块有效的区域),函数,对象,window等。

2023-07-13 14:42:58 120

原创 css 使用杂记

inline-block 出现不必要的滚动条多元素vertical-align 出现滚动条input 的line-height没有作用inline-block 元素的overflow:hidden 造成基线下移,移动到了元素下边界*block元素内存在幽灵元素div的行高是60px,其饱和两个元素,幽灵元素和span,span因为overflow: hidden造成基线下移,幽灵元素为了对齐基线(所有元素默认基线对齐),而下移到span元素下边界,又因为幽灵元素继承了div的行高,所以幽灵元素撑开

2023-06-20 14:25:14 839 1

原创 css 尺寸单位和移动端适配

以iphone为例,要想把750px的设计稿放到320px的iphone上,设计稿上的元素就要进行缩小,比例就是320px/750px=0.42。iphone是0.42,但是其他设备则不是,要解决这个问题可以用vw单位,任何设备的宽度都是100vw,那么缩放比例就是 100vw/750px=0.13333vw/px。比如一个按钮宽度是100px,那么应该写width:13.3333vw,但是这样自己换算太麻烦,完全可以让电脑来自动换算,这时可以让html{font-size:0.13333vw},1rem=

2023-06-20 11:13:25 1430

原创 oracle 使用杂记

10. 事务 1. 事务特性:ACID + 原子性(atomicity):个事务中的所有操作,相当于一个原子操作,要么全部成功,要么全部失败 + 一致性(consistency):由程序员保证,最经典案例:转账 + 隔离性(isolation):指事务和事务之间的数据可见性,是最容易出问题的地方 + 持久性(durability):事务完成以后,所有的数据都将持久到数据库中,不会因为其他原因而丢失 2. 事务隔离性

2023-06-19 16:18:41 2932

原创 mysql 杂记

意向锁 + 如果事务B申请表锁时,表中存在行锁,则需遍历表中每一行是否加锁,效率低。意向锁解决了此问题 + 事务申请行锁时,要先申请意向锁,这样事务B在申请表锁时,如果存在意向锁就会阻塞,不用在遍历表。2. mysql一致性非锁定读 先获取行的数据,如果行被加X锁,在读取行的快照。

2023-06-19 16:15:43 327

原创 mysql 执行计划

type:如何查找到行,常见值 + ALL:全表扫描 + index:全索引树扫描 + range:索引范围扫描 + ref:使用普通索引 + eq_ref:使用主键或唯一索引 + const、system:常量匹配

2023-06-19 16:14:48 783

原创 浅谈耦合和内聚

耦合的种类和耦合度:耦合的种类根据模块间的关系来划分,种类包括无直接耦合,数据耦合,标记耦合,控制耦合,公共耦合,内容耦合,耦合度由低到高。指两个模块之间传递的是简单的数据值,这种数据值不会影响模块内部的逻辑,举例说,模块A做加法运算,模块B传递给模块A两个数 1和2,结果一定是3。一般的情况就是在模块间引入一个间接模块来做中转,虽然,此时两个模块都会和该间接模块产生耦合,但是这种耦合程度是很低的。耦合度越高对模块的修改产生的影响范围越大。上述的标记耦合是两个模块公用一个结构,可以认为是最简单的公共耦合,

2023-06-19 09:48:48 314

原创 常用jar使用杂记

session中有多个同类型对象,地址不一样,id一样,outer-join=“true” 可能会造成a different object with the same identifier value was already associated with the session错误。存在多个slf4j包或没有slf4j包,因而没有找到对应方法,解决方案:删除低版本包或添加slf4j包。事务下 hibernate操作和sql操作 ,不能同时操作一个对象,否则会出现问题。

2023-06-15 13:33:08 680

原创 浅谈常用设计模式

观察者、责任链 + 观察者是无序的,相互间没有影响的;责任链是有序的,相互间是有影响的,责任链就像流水线一样,前一个人的处理会影响的下一个人。 + 观察者依赖其他流程,观察者随着其他流程的进行而进行;责任链不依赖其他流程。23种设计模式是对遵循了设计原则的好的代码的总结,并不需要刻板的照搬结构,只要你遵循了设计原则,很可能会写出第24种设计模式。

2023-06-15 10:49:05 1426

原创 spring-mvc 工作流程

+ HttpMessageConverter:将请求的数据转换为对象,将对象转换为特定格式数据,比如json + HandlerMethodArgumentResolver:从请求、cookie、session等解析出controller方法需要的参数 + HandlerMethodReturnValueHandler:处理controler的返回值,将值转换为特定格式输出,比如html,json等 + WebDataBinder:将请求数据转换为指定类型数据,并验证 + M

2023-06-09 14:04:23 537

原创 spring 循环依赖

对象实例化之后,会被ObjectFactory包裹,并放入singletonFactories中。然后在发生循环依赖的时候从earlySingletonObjects获取实例化的bean,如果不存在则singletonFactories获取ObjectFactory,并调用ObjectFactory.ge1. spring 成功构建循环依赖的条件是:必须先构建能实例化的对象,在构建依赖对象。2. spring 构建循环依赖依靠:earlySingletonObjects缓存预先存储实例化还未初始化的对象

2023-06-08 10:12:01 724

原创 @ConfigurationProperties 实现流程

+ ConfigurationPropertiesBindingPostProcessor:实现了BeanPostProcessor拦截@ConfigurationProperties标注bean的创建过程,注入值。+ EnableConfigurationPropertiesRegistrar:将ConfigurationPropertiesBindingPostProcessor放入容器;将value属性值(标注@ConfigurationProperties的bean class)放入容器

2023-05-15 10:08:26 494

原创 spring-boot 加载配置文件和配置注入流程

流程涉及的几个重要对象StringValueResolver:bean工厂依赖此对象来解析配置值ConfigFileApplicationListener:读取配置文件并放入Context中PropertySourcesPlaceholderConfigurer:实现BeanFactoryPostProcessor接口,从context中获取配置,构建StringValueResolver并放入bean工厂PropertyPlaceholderAutoConfiguration:被标注了@Conf

2023-05-11 15:28:26 604

原创 spring-boot 启动流程

1. 加载配置文件2. 加载日志组件3. 创建spring容器,扫描bean并注入容器4. 启动tomcat

2023-05-06 16:48:33 583

原创 spring-boot 依赖注入流程

1. 拦截bean的创建 要想拦截bean,就需要处理spring bean生命周期事件,spring通过一些接口来处理事件,实现属性注入,需要 InstantiationAwareBeanPostProcessor接口来完成。 2. 找到注解的字段,并注入值 获取被注解bean,然后从bean容器中中寻找响应类型的bean注入。

2023-04-28 10:46:22 1197

原创 spring-boot aop运行原理

1. 获取bean spring是bean的容器,要想拦截(代理)某个bean,要先获取bean,spring定义了bean的生命周期事件,开发者可以拦截这些事件从而获取到所有bean。2. 过滤bean,验证bean是不是需要被代理 aop中切点定义要拦截的bean方法,所以用切点表达式可以验证bean需不需要被拦截3. 将@Before等注解生成拦截方法对象,待后面调用目标方法时调用

2023-04-26 17:57:23 722

原创 java 线程池 ThreadPoolExecutor

+ corePoolSize:线程在没有任务时,需要维持的线程数。在没有任务时维持一定量的线程,可以减少在来任务时,创建线程的时间。+ allowCoreThreadTimeOut:是否允许核心线程在指定的超时时间内,获取不到结束时结束。如果为true,在没有任务时,线程不在维持corePoolSize指定的线程数,而是逐渐递减直至为0+ keepAliveTime:获取任务的超时时间,有以下两种情况会超时获取任务,其他情况会一直阻塞获取任务 + 超过了核心线程数,且队列中有任务 + 核

2023-04-24 17:37:08 449

原创 java 虚拟机杂记

如果只有一块Survivor,在清除Survivor区已死亡的对象时,因为此刻的Survivor区还有存活的对象,清除要比分两块Survivor麻烦,两块的情况,回收时只需将存活的对象移到另一块,剩下的对象直接清理即可。synchronized 的优化,最初synchronized必然会引起的内核态与用户态切换、线程阻塞造成的线程切换(重量级锁)。自旋锁:可以认为是获取锁的一种方式。当线程发现资源被锁住后,此时不立刻挂起线程,而是通过一定时间内的自循环,来尝试获取锁。偏向锁->轻量级锁->重量级锁。

2023-04-23 15:16:32 160

原创 java 集合简述

HashMap * hash表是数组,hash桶是链表 * 初始数组容量16 * 最大数组容量1

2023-04-23 15:16:00 156

原创 shiro spring-boot 基本使用

【代码】shiro spring-boot 基本使用。

2023-04-23 14:57:53 134

原创 spring-boot 常见注解

proxyBeanMethods |指定由@Bean注解定义的对象是否需要cglib代理,如果不代理,那么在调用@Bean注解标注的方法时返回的不是容器中的bean,只是一个普通的方法调用new 了一个新对象。 proxyMode |bean初始化依赖了还没有生成的某个bean,比如SCOPE_REQUEST在请求期间才会生成的bean,那么可以为这个依赖先生成一个代理对象

2023-04-20 14:08:37 496

原创 java 集合

核心使用ReentrantLock,PriorityQueue。set集合都是相应map集合的key集实现。链表实现的list,同时也是双端队列。

2023-04-13 15:53:13 66

原创 计算机文字编码

当我门在电脑屏幕上看到“中国”时,毫无疑问我们看到是两个字,就像你在纸上写的一样,但是对计算机而言,这是计算机显示的图像,是由像素组成的。还有一个特殊编码Unicode,只定义了映射关系。非utf-8字节流在转换为utf-8时丢失字节的某些位,造成最终无法还原,ISO-8859-1编码的结果是乱码,但是没丢字节位,所以能够被还原。文字编码其实就是计算机文字坐标数据和数字(二进制)建立起映射,只要告送计算机数字,通过文字编码程序,找到对应的文字坐标数据,将数据传给计算机,便能在屏幕上显示出文字。

2023-04-12 16:53:35 141

原创 java 杂记

用户创建对象时会创建强引用,以用户的角度出发在流程结束时创建的对象应该可被回收,但是所使用的的上层框架可能维持了对象的引用,这个时候上层框架可以考虑用弱引用的方式引用用户对象,这样用户流程结束强引用消失,只存在框架所保持的弱引用,这样对象可在gc时被回收。从头结点取出元素,再将头结点赋null之前,再次取出头结点的值,如果头结点仍未该元素,则置头结点的值为null,则此次取值成功,反之,如果头结点为null而不是原来取出的元素,则证明另一个线程已进行了cas操作,则此次取值失败,从头再来。

2023-04-12 11:37:59 134

原创 apache tomcat 体系结构

tomcat 处理流程可以分为三部分1. 建立连接,封装处理请求,由ProtocolHandler来完成2. tomcat核心部分,通过Wrapper,Context,Host,Engine 和 value来完成3. 由Wrapper调用servlet体系处理具体业务。

2023-04-11 15:57:19 126

原创 web 杂记

* 井号后面的数据不会发送到HTTP服务器 * 改变井号后面的参数不会触发页面的重新加载但是会留下一个历史记录 * 可以通过javascript使用window.location.hash来获取和改变井号后面的值 * HTML、CSS、JS对unicode字符的不同处理 * css表示法:\4e2d,16进制 * js表示方法:\u4e2d,16进制 * html表示方法:中 10进制 * 常见的字体格式 * WOFF:专门用于网上

2023-04-10 16:51:09 50

原创 Class.js 分析

【代码】Class.js 分析。

2023-04-10 16:12:10 97

原创 TCP协议杂记

三次握手是一个双向确认的过程,第一二次握手是客户端确认服务端是否有效的过程。接收端给发送端的ack确认只会确认最后一个连续的包,比如,发送端发了1,2,3,4,5一共五份数据,接收端收到了1,2,4,5 接收端要回ack 3,不能跳着回复。上面重传方式会有一个问题: 4,5 接收端已经收到了,但是发送方不知道,所以4,5也会重传。例子:发送端发了1,2,3,4,5一共五份数据,接收端收到了1,2,4,5。收到,关闭连接,进入CLOSED状态。收到,我这边没事了,你可以关闭了。ESTABLISHED状态。

2023-04-10 15:33:16 56

原创 https 证书和认证流程

信息验证和加解密需要依靠公钥和私钥,公钥和私钥是由程序生成的两端有关联的信息。+ **信息验证**:现在要验证信息A传递给B,为了防止被比人篡改,可以用私钥签名信息A(用特定的程序把私钥和信息混合在一起,生成一段新的非人类能理解的数据)A1,然后将A和A1一起传递给B,然后B用公钥验证A1,验证通过则A没有被篡改。+ **加解密**:现在要验证信息A传递给B,已经对A进行签名,随意不怕被篡改,但是仍可以被其他人看见内容,此时可以对A用公钥进行加密,生成密文A2,然后将A1,A2传递给B,B用私钥可以解

2023-04-07 17:25:46 528

原创 浏览器同源策略及跨域的解决方法

域名、协议(http/https)、端口相同的地址为同源,像https://a.test.com:801域名:a.test.com协议:https端口:801浏览器同源策略:浏览器禁止不同源的资源之间相互访问,包括两种iframe嵌套:iframe和外部窗口不同源ajax访问:用ajax访问不同源的资源。

2023-04-06 14:20:32 254

原创 浮点数的精确计算

浮点数的精确计算。用`BigDecimal.valueOf(0.3)`或者`newBigDecimal(Double.toString(0.3))`构造BigDecimal对象才能进行精确计算

2023-04-04 15:25:09 64

原创 apache 工具使用杂记

pluginManagement一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且你在父POM中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定版本,同时也方便统一管理;JAVA_HOME的值配错了,后来改过,但这个变量只初始化一次,所以他总是用错误的JAVA_HOME的值。什么样的包为测试源,答案是,在maven项目中包含test的依赖定义为测试源。错误:在src/test/java源文件夹下测试相关的包是找不到的,其他的包是正常的。

2023-04-03 11:38:00 320

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除