Spring
未读
写在前面的话,当前文章共有两部分,大览全局
Spring源码分析
SpringBoot的启动流程
Spring源码分析AnnotationConfigApplicationContext反推猜测应该完成什么?
生成bean对象 -> 创建beanFactory (bean工厂)
BeanDefinition类 (加载bean信息, 通过注解得来的信息) -> 注解配置解析器AnnotationBeanDefinitionReader类
AnnotationBeanDefinitionReader中读取到不同的注解,有一系列的注解解析器去解析不同的注解
类路径扫描器 ClassPathBeanDefinitionScanner
系统属性扫描器 …
深入AnnotationConfigApplicationContext注解
123456789101112131415public AnnotationConfigApplicationContext(Class<?>... componentClasses) { // 配置类可以有多 ...
段落文本 p标签语法配置参数样式预览示例源码1{% p 样式参数(参数以空格划分), 文本内容 %}
字体: logo, code
颜色: red,yellow,green,cyan,blue,gray
大小: small, h4, h3, h2, h1, large, huge, ultra
对齐方向: left, center, right
彩色文字在一段话中方便插入各种颜色的标签,包括:红色、黄色、绿色、青色、蓝色、灰色。
超大号文字文档「开始」页面中的标题部分就是超大号文字。Volantis
A Wonderful Theme for Hexo
123456- 彩色文字 在一段话中方便插入各种颜色的标签,包括:{% p red, 红色 %}、{% p yellow, 黄色 %}、{% p green, 绿色 %}、{% p cyan, 青色 %}、{% p blue, 蓝色 %}、{% p gray, 灰色 %}。- 超大号文字 文档 ...
Spring
未读
前言: 当前章节不会像SpringBoot源码分析篇章一样大篇幅的列举大量源码, 仅仅列举部分源码
负载均衡依赖首先需要导入LoadBalance依赖
12345<!--LoadBalanced--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
逐步追踪依赖通过该starter追踪找到依赖jar包中只有一个pom文件, 在pom文件中找到LoadBalance的真正依赖
123456<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> ...
Spring
未读SpringBoot笔记持续更新中!
SpringBoot发布者订阅者样例场景: 我们需要在用户注册后 给订阅的用户推送消息(例如前100名注册的 系统自动发放徽章等)
12345678@Override@Transactional // 保证事件和用户注册的一致性public Long register(User insert) { boolean save = userDao.save(insert); // 用户注册的事件 -> 谁订阅就给谁发送通知 (1.Mq 2.ApplicationEventPublisher) applicationEventPublisher.publishEvent(new UserRegisterEvent(this, insert)); // this事件订阅者,发送端 return insert.getId();}
这个时候我们可以采用Spring的推送事件ApplicationEventPublisher, 其中除此之外我们还可以采用MQ进行同等操作
消息发布者 Event事件
...
刮开看看:此篇文章旨总结在各种项目中学习到的点,无论是在工作中还是项目开发学习中,暂时不细分,等内容多了再拆分
Git常用命令这个就应该被置顶,在你看到这个的时候你可能会想,Git不是直接使用IDEA提供图形化界面就可以了吗?我想说是的,但是在我提交修复前端Bug的时候,VsCode我就没习惯他的插件提交:故 笔者列出来了常用的命令创建新分支
1git branch 分支名
更新本地远程分支情况
更新本地远程分支情况1git fetch origin
查看目前的所有分支1git branch
切换分支1git checkout 分支名
拉取远程代码更新1git pull origin 分支名
如果要使其推送变得干净(减少merge信息,让其变成一条线)1git pull origin 分支名 rebase
设置git pull默认使用rebase1git config pull.rebase true
合并本地分支到当前本地分支(master指从master合并到当前分支)1git merge master // rebase可切换merge
或者直接指定两个 ...
Jenkins
未读前言官网直达:Jenkins
Jenkins说:构建伟大,无所不能。众所周知Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
那么它的作用不就是用于自动化部署的吗?我想是的。
其中他的流程可以参考如下图
假如我们使用的是Github的话,可以使用action实现钩子程序(当然一般的企业项目不会放在github开源),假如不是那么则使用你自己的代码环境的钩子程序即可。
下载首先你得下载Jenkins 的安装和设置
如果是Windows则直接下载war包其实就可以了,没必要下上面msi,如果你用docker也是可以的。
不过,你的git环境,maven之类的环境一定要配置好,如果嫌麻烦的话,笔者等空闲时间也是会去更新这个Java环境的一些基础配置的,从下载到可以使用的教程。
从入门到会用初始化我们下载下来之后,然后java -jar jenkins.war,然后在浏览器打开,输入生成的初始化密钥,这个密钥其实最开始启动就会在屏幕上显示(windows:c:\user\username\.jenkinssecrets ...
雨雀照片引用实现参考Github hexo-yuque-picture,直接通过MarkDown语法链接引用即可(也可以通过标签)
TCP🥢三次握手
第一次握手:客户端向服务端发送一个 SYN
第二次握手:服务端接收到然后发送一个 ACK+SYN 给客户端
第三次握手:客户端接收到其信息,那么则确认接受发生都没问题,然后发送一个 ACK 给服务端
为什么要三次握手?三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
四次挥手断开连接-tcp-四次挥手
第一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端, ...
原记录于2023-10-21(创建),目前提前至此于调整布局用
力扣算法题记录s: simple m:middle h:hard
除了算法题还有场景题
链表相关单链表如下
1234567public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; }}
尾插法123456789public void addLast(Object value) { ListNode newNode = new ListNode(value); while (current.next != null) { //获取尾结点 current = current.nex ...
分布式锁分布式锁实现底层熟悉一下,关键要点关键字:1. setnx ,2. 看门狗机制实现调度续期 , 3. Lua脚本实现原子操作
插播:什么是原子操作? 事务是最小的执行单位,不允许分割。要么全部完成要么全部失败。
12RLock lock = redissonClient.getLock(key);boolean success = lock.tryLock(waitTime, timeUnit);// 跟踪Redisson锁
tryLock #tryAcquire #tryAcquireAsync
123456789101112131415161718192021222324private <T> RFuture<Long> tryAcquireAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId) { RFuture<Long> ttlRemainingFuture; if (leaseTime > 0) { ...
项目遇到需要异步执行的逻辑,那么就到线程池了
需求分析需求:1. 异步刷新我们的token(续期)
为了减少系统的开销
频繁的创建、销毁线程和线程池,会给系统带来额外的开销。未经池化及统一管理的线程,则会导致系统内线程数上限不可控。
12345678910111213@Overridepublic void renewalTokenIfNecessary(String token) { // 需要异步刷新 Long uid = getValidUid(token); String userTokenKey = getUserTokenKey(uid); Long expireDays = RedisUtils.getExpire(userTokenKey, TimeUnit.DAYS); if (expireDays == -2) { return; } if (expireDays < TOKEN_RENEW_DAYS) {// 小于一天则直接续期 Redi ...