自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [spring]SpringBoot拦截器 统一数据返回格式 统一异常处理

例如, 图书管理系统, 在访问图书list页面之前, 需要先进行登录, 如果没登录, 就需要进行强制跳转页面那么我们就需要在每个接口中都进行判断是否进行了登录, 像这样重复的代码, SpringBoot就封装成了一个框架定义一个接口类, 实现HandlerInterceptor接口, 根据需要重写里面的方法@Slf4j@Component@Overridelog.info("目标方法执行前执行");@Overridelog.info("目标方法执行后执行");@Override。

2024-09-28 14:11:03 870

原创 [spring]用MyBatis XML操作数据库 其他查询操作 数据库连接池 mysql企业开发规范 动态sql

-需要修改到上述mapper接口所对应的路径-->> < mapper namespace = " com.bite.mybatis.mapper.UserInfoXmlMapper " > > < mapper namespace = " com.bite.mybatis.mapper.UserInfoXmlMapper " > >

2024-09-24 15:33:49 862

原创 [spring]MyBatis介绍 及 用MyBatis注解操作简单数据库

简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具--需要修改到上述mapper接口所对应的路径-->> < mapper namespace = " com.bite.mybatis.mapper.UserInfoXmlMapper " > >

2024-09-23 20:57:02 798

原创 [spring]springboot日志

得到日志对象:需要使用日志工厂LoggerFactory注意:Logger 对象是属于 org.slf4j 包下的打印日志:使用info()SLF4J不同于其他⽇志框架, 它不是⼀个真正的⽇志实现, ⽽是⼀个抽象层, 对⽇志框架制定的⼀种规范,标准, 接⼝. 所有SLF4J并不能独⽴使⽤, 需要和具体的⽇志框架配合使⽤SLF4J是⻔⾯模式的典型应⽤⻔⾯模式定义⻔⾯模式(Facade Pattern)⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝, 其主要特征是定义了⼀个⾼

2024-09-23 16:09:37 1096

原创 [spring]SpringBoot配置文件

但是不同的⽤⼾有不同的偏好, 我们可以把⼿机字体的⼤⼩放在配置⽂件中, 当程序启动时, 读取配置, 以⽤⼾设置的字体⼤⼩来显⽰。硬编码是将数据直接嵌⼊到程序或其他可执⾏对象的源代码中, 也就是我们常说的"代码写死".如果采⽤硬编码的⽅式, 就直接在程序中指定字体⼤⼩, 所有的⽤⼾使⽤的都是同⼀个字体⼤⼩。properties 是以键值的形式配置的,key 和 value 之间是以"="连接的。yml 是树形结构的配置⽂件,它的基础语法是"key: value".表示被标记的这个对象要从配置中获取。

2024-09-23 09:27:18 631

原创 [spring]应用分层 及 Spring IoC&DI

那么, 就可以通过这种方式, 将多个类对象交给Spring。

2024-09-22 20:12:20 666

原创 [Spring]Spring MVC 请求和响应及用到的注解

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分。⼤⽩话: Maven是⼀个项⽬管理⼯具, 通过pom.xml⽂件的配置获取jar包,⽽不⽤⼿动去添加jar包。是类注解, 也是方法注解, 修饰类时, 表示类中所有方法都返回的是数据。直接通过url或者body的方式传递和对象中对应属性的名字的内容即可。

2024-09-20 18:14:27 1021

原创 [JVM]JVM内存划分, 类加载过程, 双亲委派模型,垃圾回收机制

此时, 俩对象相互指对方, 导致两个对象的引用计数, 都不为1, (不为0, 就不是垃圾), 但是外部的代码, 也无法访问到这俩对象, 出现"循环引用"每经过一轮GC, 生存区中都会淘汰掉一批对象, 剩下的通过复制算法, 进入到另一个生存区, 同时, 伊甸区中生存下来的也复制到这个生存区中。把创建的对象, 放在伊甸区中, 伊甸区大部分的对象, 生命周期都是比较短的, 第一轮GC到达的时候, 就会成为垃圾。所以, GC回收的是内存, 更准确说, 是对象, 回收的是"堆"上的内存。

2024-09-15 21:39:28 1253

原创 [网络]https的概念及加密过程

非对称加密的系统开销比对称加密高很多, 消耗的时间, 也比对称加密多很多, 所以不太适合使用非对称加密的方式来加密业务数据。https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的。• 由于中间的⽹络设备没有私钥, 即使截获了数据, 也⽆法还原出内部的原⽂, 也就⽆法获取到对称密。如果相等, 就说明, 证书没有被篡改过, 是有效的, 那么证书中的公钥, 就是可信的服务器公钥了。公正机构, 会生成一对非对称密钥, 分为公钥和私钥, 拿着私钥对证书中的一系列数据的。

2024-09-15 17:52:40 1345

原创 [网络]http请求中的URL,方法,header 和 http响应中的状态码

但是有个网站, 确实需要再客户端这边存储一些必要的信息, 希望能持久化存储(写到硬盘上, 重启也还在), 那么就蓝旗就给网页提供了特定的机制Cookie(并不是让网页直接读写你的硬盘, 而是对于硬盘操作, 做了一个特殊的封装, 相当于提供了一组特殊的文件, 只能往这个特殊的文件里写, 并且内容只能是键值对)被缓存, 是指通过GET获取到的一些图片, 浏览器就可以缓存这些图片, 下次访问这个网站的时候, 就不必从网络获取了, 直接从缓存的数据读取即可(缓存在硬盘上)

2024-09-15 15:08:18 682

原创 [网络]http的简单认识

HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的 应⽤层协议HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议HTTP 往往是基于传输层的 TCP 协议实现的. (HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于UDP 实现)⽬前我们主要使⽤的还是 HTTP1.1 和 HTTP2.0 . 借来的讲的 HTTP 以 1.1 版本为主我们平时打开⼀个⽹站, 就是通过 HTTP 协议来传输数据的.

2024-09-13 14:32:48 1002

原创 [网络]TCP/IP协议 之 数据链路层和DNS

如果你想申请一个域名, 搭建网站, 就需要把你的域名和ip的映射, 提交到根据名服务器这边, 然后其他的镜像就会从根域名这里同步数据。也就是说IP协议的拆包组包, 其实是当IP数据包长度达到1500字节, 就会触发拆包组包, 而不是64KB。和以太⽹并列的还有令牌环⽹, ⽆线LAN等;如果要访问域名, 我们就可以通过访问DNS服务器的方式, 查询到对应的IP地址。那么越来越多的设备要上网, 都要使用DNS服务器, DNS是怎么解决的?而目标MAC, 只是下一个路由器交换机的mac, 是不断更新的。

2024-09-12 15:29:45 1106

原创 [网络]TCP/IP协议 之 网络层IP协议(3)

此时这个数据包到达cctalk服务器之后, cctalk就会看到一个5.6.7.8这样的设备给他发的一个请求, 但是cctalk对于我的电脑的内网ip,是一无所知的。这样的一个运营商路由器, 一般是按片区的, 这个运营商服务器的局域网中的几千台内网设备, 都是通过同一个外网IP, 在公网上进行传输的。这里就描述了载荷部分, 是哪种协议的数据包, 再分用的时候, 要交给上层的哪个协议, 都是有明确声明的。原则上来说, 不同的设备, IP地址应该是唯一的, 显然这个数字, 在移动互联网的时代, 是不够用的。

2024-09-11 21:53:06 961

原创 [网络]TCP/IP协议 之 TCP协议的核心机制(2)

由于延时应答, ack不一定会立即返回, 在ack等待的过程中, 正好要返回响应数据, 那么响应数据就会捎带着, 在TCP的报头中, 将确认序号/窗口大小都设置上, 就把两次传输合并成了一次传输, 这样的策略就叫"捎带应答"TCP虽然内置了心跳包, 但是这个心跳包, 周期比较长, 指望通过这个心跳发现对端挂了, 往往需要分钟级别的时间, 在实际开发中, 经常会在应用层实现心跳包, 频率更高, 周期更短, 例如ping-pong。心跳包, 只是一个没有载荷的数据包, 如果A正常, 就能回应ACK;

2024-09-11 11:50:35 816

原创 [网络]TCP/IP五层协议之应用层,传输层(1)

网络传输中, 可能会发生后发先至, A按照1 2 3 4的顺序write, 那么B read的时候, 也要按照1 2 3 4read, 虽然传输的过程可能出现后发先至, 是乱序的, 但是不要紧, 在接收缓冲区中, 会对收到的数据先排个序, 让序号小的在前面, 序号大的在后面, 并且数据和数据之间的序号始终都是连续的, 如果前面的数据还没到, 会给这个数据留一个位置, 等待数据过来。就像发短信, 发送短信后, 对方回复, 接收到的消息, 就叫做"应答", 这样的数据, 称为"应答报文"

2024-09-10 10:53:22 822

原创 [网络编程]通过java用TCP实现网络编程

1. ServerSocketServerSocket是专门给服务器用的api构造方法:方法:2. Socket不管是客⼾端还是服务端Socket,都是双⽅建⽴连接以后,保存的对端信息,及⽤来与对⽅收发数据的构造方法:方法:服务器:第一步: 创建对象第二步: 实现start2.1 首先要建立连接这个ServerSocket的作用, 其实就是为了连接, 连接完成之后, 返回的是Socket对象, 接下来服务器进行的工作都是Socket完成的调用start方法后, 如果没有客

2024-09-09 09:37:12 996

原创 [网络编程]TCP和UDP的比较 及 通过java用UDP实现网络编程

前面我们知道, UDP是无连接的, 所以本身并没有存储对方的ip和端口信息, 但是上述我们用来接收数据的DatagramPacket中, 存放了客户端的ip和接口, 所以我们可以通过getSocketAddress()方法来获取到。我们现在只是进行一个简单的实现, 服务器收到客户端请求后, 无需做什么, 客户端请求啥, 直接响应啥, 这种程序, 就叫做"回显"(Echo)系统中的socket, 可以理解成是一种"文件", socket文件, 可以视为是"网卡"这种硬件设备的抽象表现形式。

2024-09-06 16:04:07 932

原创 [网络原理]关于网络的基本概念 及 协议

局域⽹,即 Local Area Network,简称LAN。Local 即标识了局域⽹是本地,局部组建的⼀种私有⽹络。局域⽹内的主机之间能⽅便的进⾏⽹络通信,⼜称为内⽹;局域⽹和局域⽹之间在没有连接的情况下,是⽆法通信的。

2024-09-05 20:28:34 1017

原创 [文件IO]使用java操作文件 及 字节流和字符流

Input 输入Output 输出输入输出并不是相对的, 以CPU为基准比如, 电脑可以通过网络下载文件, 也可以通过网络上传文件那么, 通过网络下载文件, 相当于从网卡到硬盘, 是input通过网络上传文件, 相当于从硬盘到网卡, 是output通过控制台, 读取数据到内存, 也是输入把数据打印显示到控制台上, 也是输出。

2024-09-05 13:56:48 871

原创 [线程]JUC中常见的类 及 集合类在多线程下的线程安全问题

下面介绍的内容是面试中常考, 但是实际开发中用不到的知识。

2024-09-04 14:57:57 928

原创 [线程]常见锁策略, synchronized的优化策略, CAS

CAS是compare and swap , 比较和交换这时一条cpu指令(是原子的), 可以完成 比较和交换 这样的一套操作下来为了理解CAS, 可以把CAS想象成一个方法:*address: 表示获取内存地址中的值reg1: 表示寄存器1中的值reg2: 表示寄存器2中的值那么此时, CAS做的工作, 其实就是先比较address内存地址中的值和reg1中的值是否相同如果相同, 则交换address地址中的值和reg2中的值其实, 此时的交换操作, 更多理解成是赋值。

2024-09-03 16:23:09 630

原创 [线程] 定时器 及 实现定时器

把这些任务通过优先级队列保存起来, 按照时间作为优先级的先后标准, 就可以做到, 队首元素就是时间最靠前的任务, 那么执行任务的时候, 只需要取队首元素即可。因为我们要实现的是小根堆, 在compareTo方法中, 是 谁 - 谁, 我们不要去背, 随便写一个试试就知道对不对了, 背很容易背错!指定一个任务(Runnable), 并且指定一个时间, 此时这个任务不会立即执行, 而是在时间到达后, 再去执行。如果是delay, 随着时间的推移, 还需要更新delay, 比较麻烦。

2024-09-02 14:45:02 903

原创 [线程]线程池 及 线程池的七个参数(面试题!)

如果使用线程池, 提前把线程创建好, 方法哦用户态代码中写的数据结构中去, 后面需要用到线程时, 随时从池子中取, 用完了放回池子里面去, 这个过程, 完全是用户态代码, 不需要和内核进行交互。非核心线程数, 在线程池不忙的时候, 不是立即回收的, 需要设置保留时间, 假设设置3s, 如果3s内, 飞核心线程数没有任务执行, 此刻就可以回收了。运行起来后, 线程并不会结束, 因为线程池中的线程是前台线程, 会阻止进程结束。后续线程池内部的工作的线程, 就消费这个队列, 从而完成具体任务的实现。

2024-09-02 12:41:28 801

原创 [线程]阻塞队列

消息队列这样的数据结构, 在实际开发中, 经常会把这样的数据结构封装成单独的服务器程序, 单独部署, 这样的服务器程序, 同时也称为消息队列。未来如果在引入C, 也让A访问C, 那么A中不需要修改任何代码, 直接在队列里读取C的数据即可, 可以提高代码的可扩展能力。那么引入消息队列, 就可以保证, 无论A给队列写多块, B都可以按照固有的节奏来消费数据, B的节奏就不一定完全跟着A了。但是由于A做的工作比较简单, 消耗的资源少, 但是B的工作复杂, 消耗的资源多, 一旦请求量大, B就容易挂。

2024-09-01 14:52:02 743

原创 [线程]单例模式 及 指令重排序

比如, 你写的服务器, 要从硬盘上加载100G的数据到内存中, 肯定要写一个类, 封装上述加载操作, 并且写一些获取 / 处理数据的业务逻辑, 这样的类, 就应该是单例的, 因为一个实例, 就要管理100G的内存数据, 搞多个实例, 就是N * 100G的内存数据, 机器肯定吃不消, 也没必要搞这么多重复的。其实, 指令重排序问题很能验证, 本身就是一个 小概率事件, 即使不加volatile, 运行很多次, 也是正确的, 但是指不定啥时候会出现问题, 我们能做的就是把volatile该加的加上即可。

2024-08-31 21:48:49 1143

原创 [线程]线程不安全问题 --- 内存可见性 及wait和notify

因为系统中线程调度是无序的, 很有可能会发生某个线程频繁获取释放锁, 由于获取的太快, 以至于其他线程捞不到CPU的资源, 虽然不会像死锁一样卡死, 但是可能会卡住一下, 这种现象, 叫做==“线程饿死”==通过条件, 判定看当前逻辑是否能够执行, 如果不能执行, 就主动wait(主动进行阻塞), 就把机会让给别的线程了, 避免该线程进行一些无意义的重试。后续t2修改count, 也是会修改工作内存, 同步拷贝到主内存, 但是由于t1没有重新读取主内存, 导致最终t1没有感知到t2的修改。

2024-08-30 20:31:51 912

原创 [线程]线程不安全问题 --- 死锁

如果同一时刻, 所有的哲学家都想要吃面条, 都同时拿起了左边的筷子, 那么当想要拿起右边筷子的时候, 就会发生阻塞等待, 每一个人都在等待右边的人放下筷子, 此时就会发生死锁!上述代码, 我们在counter对象调用add时加了counter锁, 同时在add方法中也加counter锁, 这时我们就对同一块代码加了两层锁, 形成了锁嵌套锁的结构。两个线程先分别获取两把锁, 线程1获取A, 线程2获取B, 分别拿到锁后, 在释放之前, 再次尝试获取对方的锁。

2024-08-30 16:13:45 844

原创 [线程]多线程带来的风险-线程安全问题(重要)

线程, 随机调度, 抢占式执行的, 这样的随机性, 就会使执行顺序, 产生变数, 可能会产生不同的结果, 如果这种结果认为不可接受, 则认为是bug多线程代码, 引起了bug, 这样的问题, 就是"线程安全问题"存在"线程安全问题"的代码, 就成为"线程不安全"

2024-08-29 11:36:39 962

原创 [线程]等待一个线程, 获取当前线程引用,休眠当前线程, 线程的六种状态

我们知道, 多个线程的调度顺序是无序的, 谁先被调度不确定, 谁先结束也不确定, 所以我们引入线程等待, 可以控制线程结束的先后顺序上述代码的thread 和 main 之间的结束顺序是不确定的如果我们希望让代码中的t先结束, main后结束, 就可以在main中使用线程等待join(join也要抛异常, 和sleep抛出的异常相同)我们先修改一下代码, 让thread打印六次, main打印三次, 此时一定是main先结束, 再打印几次thread后, thread才结束接下来我们加入join注

2024-08-28 20:59:21 933

原创 [线程]Thread的属性和方法及如何中断一个线程

但是起名字有个好处, java进程运行过程中, 可以通过工具看到每个不同进程的名字, 出现问题时, 更直观的把问题线程和代码关联起来(jconsole / IDEA 调试器, 都能看到线程的名字, 如果没有命名, 也有默认的名字Thread-0, Thread-1…此时, 进程中, 只有main一个前台进程了, 只要main结束了, 整个进程就结束了, main执行完start后立刻就结束了, 此时t还没来得及打印呢, 进程就结束了, 里面的线程自然也就结束了。

2024-08-28 15:29:52 907

原创 [线程]线程的概念及如何用java创建线程

此时, 每个客户端连上服务器, 服务器都会创建一个进程, 客户端断开, 再把进程释放掉, 那么如果这个服务器, 频繁地有客户来来去去, 服务器也需要频繁地创建和销毁进程, 此时就会带来新问题, 创建和销毁进程的花销太大了!把任务内容和线程拆分开, 这样的任务, 就可以给其他地方执行, 当前是通过多线程的方式执行的, 未来也可以方便改成基于线程池方式执行, 也可以改成基于虚拟线程的方式执行(改动过程很简单)但是在实际开发中, 是要自定义的,可能会打印一些日志, 把出现的异常的详情都记录到日志文件中;

2024-08-27 15:40:07 974

原创 计算机是如何工作的(2)

有些数据, 可能CPU要频繁使用, 每次使用的时候从内存读取, 速度就比较慢, 就可以把这样高频使用的数据放在缓存里(数据使用频率特别高, 放在L1缓存;进程在CPU执行过程中, 会产生很多的"中间结果", 在进程进程切换出CPU之前, 就需要把这些中间结果(CPU各种寄存器中的值)保存到PCB的上下文里(寄存器->内存, 这个过程称为。这里就把当前运行的所有进程都列了出来, 除了自己运行的程序是进程, 还有一些系统自带的/安装的某些程序, 也是进程, 这些程序对你的系统能够稳定的运行有很重要的意义。

2024-08-26 19:34:28 552

原创 计算的是如何工作的(1)

设这段数据描述了一段程序, 并从0号地址开始执行, 想要理解这段程序, 就需要结合指令表, 至于哪些是指令, 哪些是数据, 是看不出来的, 只有在程序跑起来之后才能知道(都是系统安排好的)我们假设从0号开始执行, CPU每次读取执行完一条指令后, 就会自动把pc中的值 +1 , 顺序执行下一条指令, (如果遇到跳转指令, 就不是 + 1, 而是被设置成特定的地址)一个程序, 指令和依赖的数据, 都是要在存储器中保存的, CPU如果想要执行, 都要自动的从存储器中读取到对应的指令。

2024-07-25 14:49:27 798

原创 排序数组 ---- 分治-归并

【代码】排序数组 ---- 分治-归并。

2024-06-07 19:54:27 252

原创 分治 - 快排 算法专题

i从头开始遍历, 一共有三种情况:第一种情况:nums[i] == 0, 满足左边的区域, 所以将left++, 交换nums[i]和nums[left], 此时交换过来的值一定是已经判断完的, 所以i++第二种情况:nums[i] == 1, 满足中间的区域, 不需要做交换, 直接让i++第三种情况:nums[i] == 2, 满足最右边的区域, 此时让right--, 交换nums[i]和nums[right], 此时交换过来的数据是还没有判断的, 所以i不能++

2024-06-07 15:30:40 460

原创 库存管理III ---- 分治-快排

情况三: 如果不是上述两种情况, 那么第k个最小元素一定落在>key的区间, , 此时需要去[right, r]区间去找, 但是我们要找的是第k-b-c小的元素, 因为我们舍去了=key和<key的区间。情况一: 如果第k个最小元素落在<key的区间, 说明此时a一定是>=k的, 此时只需要去[l, left]区间去找第k个最小元素即可。情况二: 如果第k个最小元素落在=key的区间, 那么b+c一定是>=k的, 此时只需要返回key即可, 因为这个区间都是key。

2024-06-07 15:25:39 411

原创 JDBC编程

全称为, 把这个词理解成"一组类"/"一组方法", 都是现成的(别的大佬写好的), 可以直接进行调用, 就可以实现一些效果对于java来说,java提供了"标准库", 叫做标准库的API, 你只要安装了java,此时就能使用数据库中的类和方法也可以使用其他大佬写好的类和方法, 叫第三方库的API, 就不是自带的了, 需要额外安装全称叫, 有的库提供的API特别多, 形成了一系列的体系, 这种情况, 称为SDK。

2024-06-07 14:05:55 899

原创 事务 ---- mysql

在日常开发中, 很多操作不是通过一个SQL完成的, 往往需要多个SQL配合完成但是当多个SQL操作时, 如果中间出现了特殊的情况(程序崩溃, 系统崩溃, 网络断开, 主机掉电......), 那么可能就会出现, 前面的SQL执行成功, 后面的SQL执行失败了考虑一个场景: 转账如果a要给b转账500, 那么a的余额-500, b的余额+500, 那么如果在a的余额-500之后, 就出现了上述的特殊情况, 那么这个钱就消失了这个时候就要使用到事务。

2024-06-06 10:51:27 1284 2

原创 数组中的第K个最大元素 ---- 分治-快排

【代码】数组中的第K个最大元素 ---- 分治-快排。

2024-06-04 19:40:59 425

原创 排序数组 ---- 分治-快排

在处理数据量有很多重复的情况下,效率会大大提升。利⽤随机选择基准函数⽣成⼀个基准元素;利⽤荷兰国旗思想将数组划分成三个区域;递归处理左边区域和右边区域。

2024-06-04 19:13:32 258

空空如也

空空如也

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

TA关注的人

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