- 博客(65)
- 收藏
- 关注
原创 泛型集合的添加与获取
除了null,无法添加其他对象,可以通过A或Object定义向上转型来读取除了null和A,无法添加其他对象,可以通过Object向上转型或强制转换来读取只有 ? extend/super 才能被强转,强转为边界或满足边界限定条件的类型 + ?extends/super 泛型集合主要用在方法参数的定义上,以便更宽泛的集合入参 + ?extends/super 作为方法参数时,能传入的参数类型和强转规则一样
2024-09-26 15:52:34
274
原创 nacos 配置读取流程
BootstrapApplicationListener将PropertySourceBootstrapConfiguration 添加到项目启动类SpringApplication中。读取spring-cloud-context.jar spring.factories中加载PropertySourceBootstrapConfiguration。向SpringApplication添加BootstrapApplicationListener。
2024-09-20 15:57:18
743
原创 分布式事务
XA、AT是在一个事务中操作多个数据源,理论上网网一个项目只会对应一个数据源,多个项目组成一套微服务系统,项目之间通过微服接口来相互调用,很少一个项目操作多个数据源。XA,AT,TCC 要求每个参与者的结果是明确的,要么成功要么失败,但一些长微服务接口,返回的结果是处理中,此时可以用SAGA模式,因为它每个微服务都是独立的,不需要整体提交回回滚。在处理微服务上,SAGA比TCC更灵活也更复杂,TCC只需实现三个接口, SAGA除了实现逆向服务还需要对整个业务进行详细的设计
2024-09-09 16:21:59
398
原创 spring 自定义事件
如何增强:第一步,继承@EventListener,第二步,实现EventListenerFactory;常见的如事务事件处理。EventListenerFactory 和 EventListenerMethodProcessor注入流程。
2024-09-04 15:03:31
999
原创 spring-boot 事件
BootstrapApplicationListener:加载spring-cloud bootstrap配置文件; LoggingSystemShutdownListener:清理日志系统资源;EnvironmentPostProcessorApplicationListener:调用EnvironmentPostProcessor实现类,如加载配置文件;LoggingApplicationListener:初始化日志系统;BackgroundPreinitializer:异步执行一些与初始化任务;Del
2024-09-02 17:50:31
632
原创 关于如何书写稳定业务代码的思考
大型软件安装的时候,都会分步完成,首先会检测环境,必要的依赖是不是已经安装,然后在一步一步安装子模块,如果哪个模块失败了,则会提醒用户处理,处理完了再重新打开安装程序,则会从失败的模块继续安装。受次启发,感觉我们的业务,也可以如此实现。一个业务往往由多个子业务(本地或分布式)组成,每个子业务都有可能失败,最终导致业务失败。如何在失败后快速、正确的恢复业务是本文讨论的内容。对于一个业务,应该提供三个接口,主接口,执行中处理接口,查询结果接口。
2024-07-19 14:13:32
450
原创 服务应具备的特性思考
保护应用服务及其相关数据的机密性、完整性和可用性,防止未经授权的访问、使用、披露、修改或破坏。能够以相对简单、高效和低成本的方式进行维护、修复和改进。能够长时间稳定运行,或在出现故障时能够很快恢复。可以轻松的通过拓展服务数量来增强服务能力。对于有状态应用,要保证各节点数据一致。
2024-07-18 10:26:35
257
原创 编码经验杂记
页面防止重复提交–> 页面表单验证–>展示loading图–>网络通信问题反馈处理 -->后台防止重复提交–> 后台数据验证–>后台业务处理–>保存数据(处里空格等)–>日志记录错误的详细信息–>展示详细处理结果和说明–>页面根据处理结果引导客户进行业务跳转。拆分服务的界限的一个考量就是可能的访问数量,像c端访问量通常远远大于b端,所以应该把c端,b端分开。友好的表单业务的完整流程。
2024-02-23 10:08:59
440
原创 vue2 项目 vscode 配置
文件-> 首先项->配置文件->显示内容/创建配置文件->打开或创settings.json,内容如下。(如果失败则直接编辑系统中的settings.json文件)在安装目录新建 node_cache 和 node_global 两个文件夹,并将node_global路径加入Path环境变量。新建或修改jsconfig.json文件(解决路径问题)下载 vs code。
2024-02-22 15:40:34
1454
原创 es6~ 常用语法总结
【代码】es6~ 常用语法总结。6. 引入了Map和Set对象 7. n次方操作符:**,eg. 2\*\*3=88. Array.includes:是否包含某元素9. async、await
2024-02-22 15:30:25
1151
原创 常见流程代码审查
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
485
原创 浅谈vue响应式
要想做到上述功能需要具备两个条件 + 属性的写入和读取必须可以被拦截(被vue管理) + 属性必须在**回调函数或watch函数中被读取**,这样才能记录属性之后被
2024-01-12 11:19:16
558
1
原创 el-form 初值和resetFields问题
给dataForm动态赋初值,必须如下,用 this.dataForm={}这种方式,其他的形式如 this.dataForm.属性、this.dataForm[属性] 都会失败且造成 el-form和resetFields 出现问题。
2023-07-19 10:13:39
554
1
原创 js 杂记
这样,对于内容动态增加并且子节点都需要相同的事件处理函数的情况,可以把事件注册上提到父节点上,这样就不需要为每个子节点注册事件监听了。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,但是,如果改变了块级作用域内声明的函数的处理规则,显然会对老代码产生很大影响。为了减轻因此产生的不兼容问题,ES6 在附录 B里面规定,浏览器的实现可以不遵守上面的规定,有自己的行为方式。this,谁调用的指向就是谁,这个“谁"可以是任何定义(在内存中一块有效的区域),函数,对象,window等。
2023-07-13 14:42:58
159
原创 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
899
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
1527
原创 oracle 使用杂记
10. 事务 1. 事务特性:ACID + 原子性(atomicity):个事务中的所有操作,相当于一个原子操作,要么全部成功,要么全部失败 + 一致性(consistency):由程序员保证,最经典案例:转账 + 隔离性(isolation):指事务和事务之间的数据可见性,是最容易出问题的地方 + 持久性(durability):事务完成以后,所有的数据都将持久到数据库中,不会因为其他原因而丢失 2. 事务隔离性
2023-06-19 16:18:41
3217
原创 mysql 杂记
意向锁 + 如果事务B申请表锁时,表中存在行锁,则需遍历表中每一行是否加锁,效率低。意向锁解决了此问题 + 事务申请行锁时,要先申请意向锁,这样事务B在申请表锁时,如果存在意向锁就会阻塞,不用在遍历表。2. mysql一致性非锁定读 先获取行的数据,如果行被加X锁,在读取行的快照。
2023-06-19 16:15:43
379
原创 mysql 执行计划
type:如何查找到行,常见值 + ALL:全表扫描 + index:全索引树扫描 + range:索引范围扫描 + ref:使用普通索引 + eq_ref:使用主键或唯一索引 + const、system:常量匹配
2023-06-19 16:14:48
851
原创 浅谈耦合和内聚
耦合的种类和耦合度:耦合的种类根据模块间的关系来划分,种类包括无直接耦合,数据耦合,标记耦合,控制耦合,公共耦合,内容耦合,耦合度由低到高。指两个模块之间传递的是简单的数据值,这种数据值不会影响模块内部的逻辑,举例说,模块A做加法运算,模块B传递给模块A两个数 1和2,结果一定是3。一般的情况就是在模块间引入一个间接模块来做中转,虽然,此时两个模块都会和该间接模块产生耦合,但是这种耦合程度是很低的。耦合度越高对模块的修改产生的影响范围越大。上述的标记耦合是两个模块公用一个结构,可以认为是最简单的公共耦合,
2023-06-19 09:48:48
399
原创 常用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
738
原创 浅谈常用设计模式
观察者、责任链 + 观察者是无序的,相互间没有影响的;责任链是有序的,相互间是有影响的,责任链就像流水线一样,前一个人的处理会影响的下一个人。 + 观察者依赖其他流程,观察者随着其他流程的进行而进行;责任链不依赖其他流程。23种设计模式是对遵循了设计原则的好的代码的总结,并不需要刻板的照搬结构,只要你遵循了设计原则,很可能会写出第24种设计模式。
2023-06-15 10:49:05
1509
原创 spring-mvc 工作流程
+ HttpMessageConverter:将请求的数据转换为对象,将对象转换为特定格式数据,比如json + HandlerMethodArgumentResolver:从请求、cookie、session等解析出controller方法需要的参数 + HandlerMethodReturnValueHandler:处理controler的返回值,将值转换为特定格式输出,比如html,json等 + WebDataBinder:将请求数据转换为指定类型数据,并验证 + M
2023-06-09 14:04:23
629
原创 spring 循环依赖
对象实例化之后,会被ObjectFactory包裹,并放入singletonFactories中。然后在发生循环依赖的时候从earlySingletonObjects获取实例化的bean,如果不存在则singletonFactories获取ObjectFactory,并调用ObjectFactory.ge1. spring 成功构建循环依赖的条件是:必须先构建能实例化的对象,在构建依赖对象。2. spring 构建循环依赖依靠:earlySingletonObjects缓存预先存储实例化还未初始化的对象
2023-06-08 10:12:01
759
原创 @ConfigurationProperties 实现流程
+ ConfigurationPropertiesBindingPostProcessor:实现了BeanPostProcessor拦截@ConfigurationProperties标注bean的创建过程,注入值。+ EnableConfigurationPropertiesRegistrar:将ConfigurationPropertiesBindingPostProcessor放入容器;将value属性值(标注@ConfigurationProperties的bean class)放入容器
2023-05-15 10:08:26
546
原创 spring-boot 加载配置文件和配置注入流程
流程涉及的几个重要对象StringValueResolver:bean工厂依赖此对象来解析配置值ConfigFileApplicationListener:读取配置文件并放入Context中PropertySourcesPlaceholderConfigurer:实现BeanFactoryPostProcessor接口,从context中获取配置,构建StringValueResolver并放入bean工厂PropertyPlaceholderAutoConfiguration:被标注了@Conf
2023-05-11 15:28:26
716
原创 spring-boot 依赖注入流程
1. 拦截bean的创建 要想拦截bean,就需要处理spring bean生命周期事件,spring通过一些接口来处理事件,实现属性注入,需要 InstantiationAwareBeanPostProcessor接口来完成。 2. 找到注解的字段,并注入值 获取被注解bean,然后从bean容器中中寻找响应类型的bean注入。
2023-04-28 10:46:22
1295
原创 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
757
原创 java 线程池 ThreadPoolExecutor
+ corePoolSize:线程在没有任务时,需要维持的线程数。在没有任务时维持一定量的线程,可以减少在来任务时,创建线程的时间。+ allowCoreThreadTimeOut:是否允许核心线程在指定的超时时间内,获取不到结束时结束。如果为true,在没有任务时,线程不在维持corePoolSize指定的线程数,而是逐渐递减直至为0+ keepAliveTime:获取任务的超时时间,有以下两种情况会超时获取任务,其他情况会一直阻塞获取任务 + 超过了核心线程数,且队列中有任务 + 核
2023-04-24 17:37:08
494
原创 java 虚拟机杂记
如果只有一块Survivor,在清除Survivor区已死亡的对象时,因为此刻的Survivor区还有存活的对象,清除要比分两块Survivor麻烦,两块的情况,回收时只需将存活的对象移到另一块,剩下的对象直接清理即可。synchronized 的优化,最初synchronized必然会引起的内核态与用户态切换、线程阻塞造成的线程切换(重量级锁)。自旋锁:可以认为是获取锁的一种方式。当线程发现资源被锁住后,此时不立刻挂起线程,而是通过一定时间内的自循环,来尝试获取锁。偏向锁->轻量级锁->重量级锁。
2023-04-23 15:16:32
186
原创 spring-boot 常见注解
proxyBeanMethods |指定由@Bean注解定义的对象是否需要cglib代理,如果不代理,那么在调用@Bean注解标注的方法时返回的不是容器中的bean,只是一个普通的方法调用new 了一个新对象。 proxyMode |bean初始化依赖了还没有生成的某个bean,比如SCOPE_REQUEST在请求期间才会生成的bean,那么可以为这个依赖先生成一个代理对象
2023-04-20 14:08:37
563
原创 java 集合
核心使用ReentrantLock,PriorityQueue。set集合都是相应map集合的key集实现。链表实现的list,同时也是双端队列。
2023-04-13 15:53:13
84
原创 计算机文字编码
当我门在电脑屏幕上看到“中国”时,毫无疑问我们看到是两个字,就像你在纸上写的一样,但是对计算机而言,这是计算机显示的图像,是由像素组成的。还有一个特殊编码Unicode,只定义了映射关系。非utf-8字节流在转换为utf-8时丢失字节的某些位,造成最终无法还原,ISO-8859-1编码的结果是乱码,但是没丢字节位,所以能够被还原。文字编码其实就是计算机文字坐标数据和数字(二进制)建立起映射,只要告送计算机数字,通过文字编码程序,找到对应的文字坐标数据,将数据传给计算机,便能在屏幕上显示出文字。
2023-04-12 16:53:35
201
原创 java 杂记
用户创建对象时会创建强引用,以用户的角度出发在流程结束时创建的对象应该可被回收,但是所使用的的上层框架可能维持了对象的引用,这个时候上层框架可以考虑用弱引用的方式引用用户对象,这样用户流程结束强引用消失,只存在框架所保持的弱引用,这样对象可在gc时被回收。从头结点取出元素,再将头结点赋null之前,再次取出头结点的值,如果头结点仍未该元素,则置头结点的值为null,则此次取值成功,反之,如果头结点为null而不是原来取出的元素,则证明另一个线程已进行了cas操作,则此次取值失败,从头再来。
2023-04-12 11:37:59
179
原创 apache tomcat 体系结构
tomcat 处理流程可以分为三部分1. 建立连接,封装处理请求,由ProtocolHandler来完成2. tomcat核心部分,通过Wrapper,Context,Host,Engine 和 value来完成3. 由Wrapper调用servlet体系处理具体业务。
2023-04-11 15:57:19
180
原创 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
92
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人