自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis

直接输入:yum -y install redis;输入命令:vim /etc/redis.conf; 1. 然后在里面将 “bind 127.0.0.1” 注释掉 2. 将 “protected-mode yes” 改为“protected-mode no” 3. (非必须)设置密码:可以使用 “/” 再加上 requirepass 来进行搜索,然后找到 “requirepass foobared”,foobared → 设置成自己的密码,然后再把这行前面的 “#

2024-06-25 16:30:09 328

原创 Spring事务 和 事务传播机制

Spring 中事务的实现这里的 事务 和之前 MySQL的事务 一样,都是表示将⼀组操作封装成⼀个执⾏单元(封装到⼀起),要么全部成功,要么全部失败。Spring 中事务的实现1.编程式事务(手动档)。运行结果:2.声明式事务(自动挡)。

2024-06-18 17:15:35 948

原创 拦截器 之 用户登录判断

Componentpublic class LoginInterceptor implements HandlerInterceptor { // 继承这个接口表示当前是一个自定义拦截器// 生成重写代码,此方法表示在目标方法前调用,返回的是一个 boolean 类型的// 返回 true 表示拦截器校验成功,正常执行// 返回 false 表示拦截器校验失败,不会往下执行@Override// 判断用户是否登录= null) {// 说明用户已经登陆。

2024-06-15 16:58:23 413

原创 Spring AOP

AOP 组成的相关概念。AOP(Aspect Oriented Programming):面向切编程。是对某⼀类事情的集中处理,例如网站的登录验证,不使用 AOP 的话发布文章需要一段代码进行验证、编辑文章需要验证......而使用 AOP 的话只需要在某⼀处配置⼀下,需要验证的地方都可以实现了。AOP 是⼀种思想,而 Spring AOP 是⼀个框架,提供了⼀种对 AOP 思想的实现,它们的关系和IoC 与 DI 类似。AOP 组成的相关概念。

2024-06-14 18:31:53 617 1

原创 MyBatis 获取参数的两种方式

使用这种方式的结果是直接替换。

2024-06-14 15:38:59 126

原创 动态 SQL

例如在有一些网站进行注册的时候,会要求必须输入邮箱、密码,而那些年龄性别什么的则并不是必填项。假设现在有种情况:全部数据都是非必传的,其中有一个数据传过来了,但是后面没数据就会导致 SQL 语句中多出来了一个 , 逗号就会导致报错。也就是说执行的 SQL 语句并不是固定的,而是不同人的不同操作执行的语句会有所差异。用在 update 修改操作里面的,跟 的使用一样,如果不传的话就不会生成,绑定⽅法参数中的集合,即表示需要 foreach 的是谁。遍历时的每⼀个对象,每次循环的是什么。

2024-06-13 21:51:46 496

原创 使用 MyBatis 来增删改查数据库

MyBatis 是一个更简单完成程序和数据库交互的⼯具,也就是更简单的操作和读取数据库⼯具。

2024-06-12 16:21:44 439

原创 spring MVC

MVC 是Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。● Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。● View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。(这个基本没有了,前后端分离了)● Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。

2024-06-07 19:52:27 653

原创 关于 spring boot 的 目录详解 和 配置文件 以及 日志

spring boot 的配置文件有两种格式,分别是 properties 和 yml(yaml)。这两种格式的配置文件是可以同时存在的,此时会以 properties 的文件为主,但一般都是使用同一种格式的。

2024-06-04 20:22:04 479

原创 Bean 作用域和生命周期

先通过下述代码来感受下 Bean 的作用域然后使用两个不同的类去获取 Bean运行后发现:一个地方改了,这个 Bean 就变了,已经不是原来的值了这是因为 Bean 默认情况下是单例状态(singleton),也就是所有地方的使⽤的都是同⼀个对象,因为单例可以很大程度上提高性能,所以在 Spring 中 Bean 的作⽤域默认就是 singleton 单例模式。

2024-06-01 20:55:40 482

原创 获取 Bean 对象更加简单的方式

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊。对象装配(对象注⼊)即DI 实现依赖注入的方式有3 种:1. 属性注⼊2. 构造⽅法注⼊3. Setter 注⼊。

2024-06-01 14:28:02 443

原创 存储 Bean 对象更加简单的方式

如果是在spring-config 中添加 bean 标签来注册内容,每个类都要弄一次就显得麻烦和臃肿了,对于 new 操作而言就没有什么优势了。因此 spring 就引入了注解操作来实现对 Bean 对象的存储。配置扫描路径想要将对象成功的存储到 Spring 中,就需要配置⼀下存储对象的路径,只有在这个路径下的(也包含子路径)所有类,添加了注解才能被正确的识别并保存到 Spring 中。 和 component-san 是可以同时存在的。

2024-05-31 17:33:18 316

原创 Spring 创建和使用

创建 Spring 项目创建 Spring 项目主要分为三步。

2024-05-30 15:05:15 395

原创 关于 Spring 是什么

Spring 就是一个包含了多种工具和方法的 IoC 容器。把 Bean 对象存进 IoC 容器中,从 IoC 中把 Bean 对象取出来。IoC 和 DI 描述的是同一件事,只是再细致区分的话会有所不同:IoC 是一种思想,DI 是一种具体实现的技术。Spring 最核心的功能就是 IoC 容器的 存 和 取。

2024-05-29 19:13:10 932

原创 关于 JVM

像办公楼一样,有办公区休息区吃饭区啥的,JVM 这个应用程序就会在启动的时候就会向操作系统申请一块内存区域,然后把这个区域分成几个部分,每个部分有不同的功能作用。一个 Java 进程就对应一个 JVM。(虽然说这里的栈也是“先进后出”的,但数据结构的栈是个更大的概念,这里的特指 JVM 的一块内存空间)native 表示 JVM 内部的 C++ 代码,这里就是给调用 native 方法(JVM 内部的方法)准备的栈空间。这里存储的是 native 方法之间的调用关系。记录当前线程执行到哪个指令了。

2024-05-27 20:57:56 850

原创 Cookie 和 Session

HTTP 协议属于 "无状态" 协议:默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是大多数时候, 我们是需要知道请求之间的关联关系的。例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求之前是不是登陆过了。图中的 "令牌" (sessionid)通常就存储在 Cookie 字段中(相当于给了一张超市会员卡)。此时在服务器这边就需要记录令牌信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的工作.

2024-05-22 20:18:15 700

原创 Servlet 的 API

init:当 tomcat 收到了 /hello 这样的路径是请求后就会调用 HelloServlet,于是就需要对 HelloServlet 进行实例化(只实例一次,后续再有请求也不实例了)。destory:如果是通过 smart tomcat 的停止按钮,这个操作本质上是通过 tomcat 的 8005 端口主动停止,能够触发 destory。但如果是直接杀进程,此时很可能来不及执行 destory(这种情况比较常见)。

2024-05-22 19:28:24 1124

原创 Servlet 是什么及创建第一个 Servlet 程序

网站的后端就涉及到 http 服务器,因此肯定需要针对 http 协议进行一系列操作。tomcat 已经把这些相关操作已经封装好了,就叫 Servlet。Servlet 是一种实现动态页面的技术是一组Tomcat提供给程序猿的API,帮助程序猿简单高效的开发一个 web app.静态页面:内容始终固定的页面即使页面内容也不会发生变化.(tomcat 官网每个人的页面都是一样的)页面内容会发生变化.(B站每个人的页面都是不一样的)使用IDEA创建一个Maven项目。

2024-05-18 16:49:45 742

原创 Tomcat

下载安装这里所说的 Tomcat 并不是动画片里的而是一个学习了 HTTP协议知道了HTTP协议就是HTTP客户端和HTTP服务器之间的交互数据的格。同时也通过 ajax和分别构造了HTTP客户端. HTTP 服务器我们也同样可以通过来实现而Tomcat就是基于Java实现的一个开源免费, 也是被广泛使用的 HTTP服务器。下载安装。

2024-05-18 13:57:40 284 1

原创 应用层之 HTTP 协议

HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议。所谓 "超文本" 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些 其他的资源, 比如图片, 视频, 音频等二进制的数据。浏览器获取到网页,就是基于 HTTP 的,也就相当于 浏览器 和 服务器 之间的桥梁。目前我们主要使用的还是 HTTP1.1。

2024-05-15 16:12:33 750

原创 DOM API

要能够和用户交互,就得先知道用户干了啥,用户做的一些动作,会在浏览器中产生一些事件(鼠标点击、按下键盘、调整浏览器窗口等),然后代码就需要针对这些事件作出反应。就像一放学回家,老妈(事件源)就一脸严肃坐在沙发上盯着我(事件类型),我这时就紧张地回忆我犯了什么事,是考试不及格还是偷偷吃辣条(事件处理程序)。使用 innerHTML 属性就能拿到元素里面的内容(开始标签 和 结束标签 夹着的内容),修改这个属性,就会影响到界面的显示。如果需要与指定选择器匹配的所有元素的列表,则应该使用。

2024-05-13 14:53:32 987

原创 应用层协议之 DNS 协议

就是一个域名解析系统。域名就是网址,类似于 www.baidu.com。网络上的服务器想要访问它,就得需要它对应的 IP 地址,同时,每个域名对对应着一个 / N个 IP 地址(即对应多台服务器)。因此,为了能够把域名和 IP 地址给对应上,就有了以下两种方法。

2024-05-09 17:19:19 342

原创 数据链路层之 以太网协议

这个协议即规定了数据链路层,同时也规定了物理层的内容。平时使用到的网线,其实也叫做“以太网线”(遵守以太网协议的网线)。

2024-05-09 16:28:40 393

原创 网络层协议之 IP 协议

一个数据报构造出来会有一个初始的 TTL 数值(比如 32、64),这个报每经过一个路由器转发,TTL-1,如果一直减到 0,还没有到达目标,那么就会认为这个报永远不会到达了,就会丢弃。8 位服务类型:实际上只有 4 位是有效的,这四位中只能出现 1 位是 1,其余的都是 0,因此就表示 IP 协议的四种形态 / 四种工作模式:最小延时、最大吞吐量、最高可靠性、最小成本。4 位首部长度:描述了 IP 报头多长,IP 报头是变长的,因为报头中的选项部分是可有可无的,此处的单位也是 4 字节(

2024-05-08 20:39:03 1178

原创 传输层之 TCP 协议

源/目的端口号:表示数据是从哪个进程来,到哪个进程去。序号:发送数据的序号。确认序号:应答报文的序号,用来回复发送方的。4 位首部长度:一个 TCP 报头,长度是可变的,不像 UDP 固定是 8 个字节。描述了 TCP 报头具体多长。因为选项之前的部分都是确定的 20 字节,所以首部长度 -20 字节就是选项部分的长度。如果首部长度值是 5,表示整个 TCP 报头是20字节(相当于没有选项)。

2024-05-03 20:28:08 924

原创 传输层之 UDP 协议

发送方会发数据和校验和过去,接收方会针对收到的数据生成一个校验和跟收到的校验和进行比较,一样的话就是正确的,不一样就会直接丢弃。因为 UDP 报文长度是 2 个字节表示,即 16 位,表示的范围是 -32768 → +32767,即 0 → 65535,换算单位就是 64 KB。UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一 致;UDP 会把载荷数据,就是通过 UDP Socket,即 send 方法拿来的数据基础上,在前面拼接上 8 个字节的报头。

2024-05-03 09:39:59 1138

原创 TCP流套接字编程

ServerSocket 是专门给服务器使用的 Socket 对象。

2024-04-27 16:42:58 1119

原创 UDP数据报套接字编程

DatagramSocket,是UDP Socket,用于发送和收 UDP 数据报。使用这个类,表示一个 socket 对象。一个 socket 对象只能跟一台主机进行通信。在操作系统中,把这个 socket 对象当成一个文件来处理的,相当于是 文件描述符表 上的一项。创建一个UDP数据报套接字的Socket,随机分配一个空闲端口(一般用于客户端)创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端)从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)

2024-04-25 20:33:26 561

原创 关于死锁的详谈

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。光头强和女神一起去饺子馆吃饺子. 吃饺子需要酱油和醋,光头强抄起了酱油瓶, 女神抄起了醋瓶.光头强: 你先把醋瓶给我, 我用完了就把酱油瓶给你.光头强: 你先把酱油瓶给我, 我用完了就把醋瓶给你.如果这俩人彼此之间互不相让, 就构成了死锁.酱油和醋相当于是两把锁, 这两个人就是两个线程.为了进一步阐述死锁的形成, 很多资料上也会谈论到 "哲学家就餐问题".

2024-04-20 11:15:01 869

原创 JUC(java.util.concurrent) 的常见类

Callable 是一个 interface(类似之前的 Runnable,用来描述一个任务,但是没有返回值)也是描述一个任务的,有返回值。方便程序猿借助多线程的方式计算结果.创建线程计算 1 + 2 + 3 + ... + 1000, 不使用 Callable。

2024-04-20 10:29:21 1393

原创 八股文之 synchronized 原理

偏向锁不是真的 "加锁", 只是给对象头中做一个 "偏向锁的标记", 记录这个锁属于哪个线程. 如果后续没有其他线程来竞争该锁, 那么就不用进行其他同步操作了(避免了加锁解锁的开销) 如果后续有其他线程来竞争该锁(刚才已经在锁对象中记录了当前锁属于哪个线程了, 很容易识别当前申请锁的线程是不是之前记录的线程), 那就取消原来的偏向锁状态, 升级成轻量级锁状态. 偏向锁本质上相当于 "延迟加锁" . 能不加锁就不加锁, 尽量来避免不必要的加锁开销. 但是该做的标记还是得做的, 否则无法区分何时需要真正加锁.

2024-04-19 12:59:02 1104

原创 八股文之 CAS

CAS: 全称Compare and swap,字面意思:”比较并交换“,一个 CAS 涉及到以下操作:我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。1. 比较 A 与 V 是否相等。(比较)2. 如果比较相等,将 B 写入 V。(交换)3. 返回操作是否成功。上述这个 CAS 过程并非是通过一段代码实现的,而是通过。

2024-04-18 14:30:27 1050

原创 八股文之“常见的锁策略“

接下来讲解的锁策略不仅仅是局限于 Java . 任何和 "锁" 相关的话题, 都可能会涉及到以下内容. 这些特性主要是给锁的实现者来参考的.也就是说你实现锁的时候,考虑出现锁竞争了咋办。普通的程序猿也需要了解一些, 对于合理的使用锁也是有很大帮助的.预测锁竞争不是很激烈,做的工作相对少一些预测锁竞争会很激烈,做的工作相对多一些举个栗子: 同学 A 和 同学 B 想请教老师一个问题.同学 A 认为 "老师是比较忙的, 我来问问题, 老师不一定有空解答". 因此同学 A 会先给老师发消息: "老师你忙嘛。

2024-04-17 10:45:27 821

原创 Java的定时器

schedule 包含两个参数. 第一个参数指定即将要执行的任务代码, 第二个参数指定多长时间之后执行 (单位为毫秒)。原因:把时间小的作为优先级高的先执行,如果还没到指定的执行时间就阻塞。此时就只需看队首元素即可,时间复杂度就是O(1)。定时器是软件开发中的一个重要组件. 类似于一个 "闹钟"。达到一个设定的时间之后, 就执行某个指定好的代码.比如一个 Map, 希望里面的某个 key 在 3s 之后过期(自动删除).b)一个在定时器内部的线程(用来扫描队首元素是否可以执行)a)一个带优先级的阻塞队列。

2024-04-16 17:28:57 745

原创 关于阻塞式队列

阻塞队列是一种特殊的队列. 也遵守 "先进先出" 的原则.阻塞队列能是一种线程安全的数据结构, 并且具有以下特性:a) 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素.b) 当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插入元素.生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。

2024-04-14 14:17:33 529

原创 单例模式以及常见的两种实现模式

此时在 t2 的角度 instance 就非空了,就会直接返回instance 了,但由于 t1 的 2 指令还没执行完,t2 拿到的是一个非法的对象(还没构造完成的不完整的对象),这时候如果尝试使用引用中的属性就会出现错误。因为 static 修饰的变量落入到了类对象里面,又因为类对象是在类加载阶段内创建出来的唯一一个实例,同时构造方法是 private 修饰的,因此就只有这一个实例的成员了。类加载的时候不创建实例,第一次使用的时候才创建实例,如果不用就不创建了(效率更高了)

2024-04-11 16:18:00 1256

原创 wait 和 notify

P 打算去 ATM 上取点钱,但是这时候显示没钱了,这时候 P 就要出去等在外面排队的人进去查余额、存款、转账......结果在排队的人都是取钱的,这时候运钞车就来了,工作人员把钱放进去之后说:可以了。多个线程 wait 的时候,notify 是随机唤醒一个,notifyAll 是所有的线程都唤醒,然后这些线程再一起竞争锁。其实理论上 wait 和 sleep 完全是没有可比性的,因为一个是用于线程之间的通信的,一个是让线程阻塞一段时间,唯一的相同点就是都可以让线程放弃执行一段时间.

2024-04-09 15:43:15 1123

原创 volatile 关键字

在 Java 程序里,有主内存,每个线程也有自己的工作内存 ( t1 和 t2 的工作内存不是同一个东西 ) t1 线程在进行读取的时候,只是读取了工作内存中的值. t2 线程在进行修改的时候,先修改工作内存的值,然后再把工作内存的内容同步到主内存中 但是由于编译器优化,导致 t1 没有重新从主内存中同步数据到工作内存,因此读到的结果就是“修改之前”的。

2024-04-08 17:37:16 1020

原创 多线程带来的的风险-线程安全、锁的问题

值的一提的是, 快和慢都是相对的. CPU 访问寄存器速度远远快于内存, 但是内存的访问速度又远远快于硬盘.对应的, CPU 的价格最贵, 内存次之, 硬盘最便宜.这种叫做指令重排序。由于每个线程有自己的工作内存, 这些工作内存中的内容相当于同一个共享变量的 "副本". 此时修改线程1 的工作内存中的值, 线程2 的工作内存不一定会及时变化.但是是非原子的,出现线程安全问题的概率就非常高了。所谓的 "主内存" 才是真正硬件角度的 "内存". 而所谓的 "工作内存", 则是指 CPU 的寄存器和高速缓存.

2024-04-01 15:07:59 1164 1

原创 线程的状态

状态是针对当前的线程调度的情况来描述的。线程是调度的基本单位,状态更应该是线程的属性。线程的状态是一个枚举类型 Thread.State1. NEW:安排了工作, 还未开始行动(创建了 Thread 对象,但还没有调用 start (内核里还没有创建对应 PCB ))2. TERMINATED:工作完成了(表示内核中的 PCB 已经执行完毕了,但是 Thread 对象还在)3. RUNNABLE: 可工作的a)正在 CPU 上执行的b)在就绪队列里,随时可以去 CPU 执行的。

2024-03-31 10:41:15 567

空空如也

空空如也

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

TA关注的人

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