- 博客(212)
- 收藏
- 关注
原创 Java Spring原理 --- Bean的作用域,Bean的生命周期,Spring自动配置
出现的问题:没有验证成功的原因是我们写的是同一个User对象,@Data中的hashcode()会根据id判断他们是否是同一个对象,**这里的new User()都是同一个对象,那么这里就判断了他们是同一个对象,Spring进行了优化,**因此每次request刷新都不变,理论上每次刷新,都会创建一个新的对象,每次都会变化。application的作用域:在整个应用中都是同一个的,和我们的单例一样,在同一个应用中都是同一个。展示效果:每次刷新,拿到的不是同一个对象,每次请求都会生成一个新的对象。
2025-10-26 19:50:44
1875
42
原创 Java Spring事务,事务的传播机制
比如:转账2. 数据库执行事务Spring对于事务的实现(1) 编程式实现(和数据库是一样的)手动开启事务手动提交事务/手动回滚事务(2) 声明式事务(利用自动开启事务和提交事务),推荐使用这种方式通过注解来实现对事务的操作,必然要使用数据库MyBatis版本不匹配如果引入了MyBatis的依赖,就需要配置数据库引入MyBatis依赖之所以感觉“需要”配置数据库,是因为Spring Boot的自动配置机制被触发,它试图为你创建一个完整可用的MyBatis环境,而这个环境的基石——数据源(
2025-10-25 17:17:03
1183
9
原创 Java SpringAOP --- AOP的使用,AOP的源码
为了解决要包含这个类的所有方法,所有的类,这种就太宽泛了,为了指定特定的路径或者是方法使用注解匹配。匹配com.example.demo包下, 子孙包下的所有类的所有方法。那么代理接口的时候,什么时候使用JDK,什么时候使用CGLIB?123班学生今天要进行javaee的考试,要进行的考试就是。通知:具体的逻辑,要做什么处理(可以理解为代码的逻辑)连接点:切面要作用的方法,目标方法,切点要描述的方法。匹配controller包下所有的类的所有方法。什么时候使用JDK,什么时候使用CGLIB?
2025-10-24 21:14:42
1460
27
原创 Java SpringBoot 统一功能处理
对上面内容的总结源码阅读过滤器是servlet提供的,暂且不用看Spring源码都是以了解(通过源码,了解Spring的流程)为主(应付面试)对上面内容的总结:(1) 拦截器:作用维度是URL(2) 统一数据返回格式(3) 统一异常处理。
2025-10-23 14:28:29
947
1
原创 Java MyBatis(二)--- 多表查询,# 和 $的区别,SQL注入,数据库连接池,动态SQL
排序的时候,不能使用 $,会出现sql注入的问题,可以在传参的时候,进行判断是否是asc或者是desc,如果是这两个就可以使用 $ ,不是就不使用 $,这样就避免了sql注入。使用 # 时,如果参数为String,会自动加上 ‘’,$ 不会,$ 符号是直接拼接,$ 如果是字符串类型,需要加上 ‘’(比如你火车上的位置都是一格一格的,你只能在你的坐在你的那格(就是#),如果你可以占用其它格(就是$)如果不管怎样,使用 $ 都加上引号(‘’),虽然mysql会帮我们转换类型,但是会有性能上的影响。
2025-10-20 19:55:49
1901
33
原创 Java MyBatis(一)--- 注解和XML的使用
对上面内容的总结:(1) 引入依赖(2) 配置数据库(3) 写MyBatis代码1.注解2.xml方式打印Mybatis的日志的配置(日志都在调试的时候打印)上面的配置建议只出现在开发环境中,不要出现在线上环境中。
2025-10-18 16:28:31
1617
33
原创 Java Spring日志
jar包和war包的区别:JAR包是Java类库的归档文件,而WAR包是专门用于Web应用程序的归档文件。热加载:写的代码,立即被加载进来,生效了热部署:如果代码发生了变动,就会重新部署运行SpringBoot程序(不在idea上运行的情况)(1) 打jar包(2) 通过java -jar XXX.jar启动Java虚拟机,并运行一个打包好的、名为 XXX.jar 的Java应用程序如果要修改application.properties或者是application.yml文件的名字,就需要指定配置
2025-10-17 12:01:01
4369
9
原创 Java Spring配置
比如在数据库中你的账号,密码是写死在你的代码中的,别人要使用你的数据库,就需要你把源码给别人,这是很麻烦的,所以才有了配置文件。转义的意思,每个人的理解都不一样,如果面试官认为 \n 是换行为转义的,没有换行就是没有转义的,也是可以的。这里是赋值给key,如果没有去掉 $ ,就是拿到配置文件中的值,验证码的插件:Kaptcha 插件,根据后端生成的验证码。key 的格式建议是小写,单词之间使用 . 分割。如果去掉$,就会把 " "中的值赋值给当前变量。目的:重新获取请求,不让浏览器进行缓存,
2025-10-16 15:25:16
1533
23
原创 Java SpringIoC&DI --- @Bean,DI
可以进行端口号的修改:端口号我们能够使用的范围:0 ~ 655350 ~ 1024 被一些协议所占用,8080被Tomcat所占用,3306被mysql所占用,其它端口号,我们都可以使用五大注解实现的类是预加载的(先全部加载出这些类)Bean的存可以自己对Bean的名称进行命名:一个Bean可以命名多个名称:Bean的取。
2025-10-14 20:24:00
1397
29
原创 Java SpringMVC(三)--- SpringMVC,SpringIoC&DI
SpringBoot和SpringMVC之间的关系?使用SpringBoot创建SpringMVC框架(SpringMVC是一个web框架)对上面内容的总结:Spring包括了Spring家族Spring中有Spring Core,Spring Framework等(1) Spring,SpringMVC,SpringBoot区别?Spring是一个管理对象的容器,Spring是包含众多工具的IoC容器,Spring存的是对象,对象这个词,在Spring的范围内,称为bean。
2025-10-12 14:29:32
939
12
原创 Java SpringMVC(二) --- 响应,综合性练习
2.@RestController包括:@Controller和@ResponseBody现在@RestController被用来返回数据了3.@Controller的作用:告诉Spring,帮我们管理这个代码,我们后续访问时,才能访问到,才能使用我们写的代码,不写这个注解,Spring是不管这个代码的注解的生命周期:举个例子,写一个简单的静态页面(会打印index.html文件上的内容):如果有多个注解,注解的顺序是不影响结果的返回数据@Responsebody@Responsebo
2025-10-10 18:07:26
1705
32
原创 Java SpringMVC(一) --- 建立连接,请求,获取Cookie,Session,Header
对上面内容的一个总结:6. 传递数组当我们的请求,同一个参数有多个时,浏览器就会帮我们给封装成一个数组return "接收到的参数arrayParam: " + Arrays.toString(arrayParam) + ",长度为: " + arrayParam.length;传递集合@RequestParam让上传的参数变为不是非必须上传的,不上传的时候,值为null。
2025-10-08 16:01:44
1642
34
原创 Java SpringBoot --- 下载Spring相关插件,创建一个Spring项目,创建项目出现的问题
修改文件名:shift + F6test文件中也有这个文件,下图就是也要修改test文件中的这个名字吗不要直接修改文件名,通过idea提供的方式修改文件名的好处:1.idea会帮我们查找相关的代码2.idea会进行提示3.idea会帮我们把关联的文件名相关的代码全部修改。
2025-10-07 11:55:24
1574
24
原创 Java Servlet(三)--- 写一个简单的网站,表白墙程序,登录功能的实现
前后端交互的总体逻辑页面加载把返回的数据构造成html片段,显示到网页上把messageList里的数据返回给浏览器点击按钮,提交消息把这个数据保存到messageList中@Override'}';@Override// 读取前端发来的数据,把这个数据保存到服务器中System.out.println("请求中收到的message " + message);
2025-10-05 16:57:01
2222
31
原创 Java Linux --- 基本命令,部署Java web程序到线上访问
各种控制台程序的界面都可以使用。在Linux命令行中,复制 ctrl + insert,粘贴 shift + insert,其实windows上也支持的(这里的复制粘贴是xshell提供的,也可以自己修改一下的)Linux会把一些软件包,放到对应的服务器上,通过包管理器这样的程序,来吧这些软件包给下载安装(但是这里的软件包不一定全,还好向mysql,jdk这些知名的软件还是存在的)mysql5和mysql8设置密码的方式是不一样的,上述是用不了方案二,把密码关闭掉,所以只能使用方案一来设置我们的密码了。
2025-10-04 17:18:09
2727
24
原创 Java JVM --- JVM内存区域划分,类加载,GC垃圾回收
循环引用:存在一个a引用一个对象,一个b引用一个对象,然后a里的的t引用b对象,b里面的t引用a对象,再把a对象和b对象置为null,销毁两引用。那么这两个对象中的t互相引用,要拿到a对象中的t,需要b对象中的t,要拿到b对象中的t,需要a对象中的t。,时间上消耗比较大),当前某个对象是否是垃圾,是随着代码的执行,会发生改变(可能当前这个不是垃圾,随着代码的执行,这个就变成了垃圾)此时这个空间上的内存的数值,就是全0的。(方法区里,每个方法,里面的指令,都是以二进制的形式存在的,保存到对应的类对象中的)
2025-10-03 15:42:47
1530
24
原创 Java Servlet(二)--- HttpServlet,HttpServletRequest,HttpServletResponse
如果不重写service,在父类(HttpServlet中)自己的service,就会根据请求的方法,来分别调用下面的doGet,doPost,doPut…(会通过if条件进行匹配是哪种请求)
2025-09-27 17:06:05
1469
31
原创 Java Servlet(一)--- Servlet hello world的写法,smart tomcat,Servlet代码中的常见问题
高效率地解决实际问题,问题的详细情况,解决问题的具体过程也就是所谓的业务。
2025-09-26 15:07:47
1400
8
原创 Java HTTP协议(二)--- HTTPS,Tomcat
面试中经典的面试题https加密:(1) 对称加密,加密业务数据(2) 非对称加密,加密对称密钥(3) 中间人攻击(4) 使用证书,来验证服务器的公钥这些相结合,就保证了https的安全性了。
2025-09-25 15:33:57
1609
30
原创 Java HTTP协议(一)--- HTTP,报文格式,请求和响应
解压缩之后,可以看到,响应的数据其实是 html,浏览器上显示的网页,就是html,往往都是浏览器先请求对应的服务器,从服务器这边拿到的 网页 数据(html),每次访问网页,都会下载对应的网页数据,会消耗一定的带宽(不像我们下载APP一样,只需要下载一次)如果你的 fiddler 不能抓包了,一定要检查关闭之前的开启的代理软件(也可能是一个浏览器插件),如果还是不行,还可以尝试换一个浏览器,有的时候 edge浏览器 可能会不行,比如出现下面这样的情况。如果任何时候吃草,挤出来的都是奶,就是幂等的。
2025-09-23 21:04:05
1230
29
原创 Java 网络原理(二)--- TCP的机制 + IP协议 +以太网协议 + DNS
确认边界:1.引入分隔符2.引入长度xml:边界是结束标签json:边界是{}protobuffer:边界是长度。
2025-09-21 16:03:49
1429
10
原创 Java 网络原理(一)--- 自定义协议,UDP协议和TCP协议
根据需求,明确要传输的信息约定好信息按照什么形式来组织自定义协议:请求和响应包含哪些信息,按照什么方式来组织3. 文本方式构造的协议。
2025-09-19 20:50:59
1830
35
原创 Java 网络编程(二) --- TCP的socket的api
的结构,让第一个循环中的processConnection方法变成多线程的,让主线程执行的同时(处理多个客户端的accept),副线程(当前执行的客户端)执行它的逻辑。默认情况下,IDEA只允许一个代码只能创建一个进程,通过上述操作,勾选了 Allow multiple instances,此时就可以运行多个进程了。4. 上述代码还是有点问题,如果有多个客户端调用,频繁地建立连接和断开连接,就会频繁的创建线程和销毁线程,会产生大量的开销。请求是一个单词,响应就会返回对应的中文翻译。(带有一点点的业务逻辑)
2025-09-18 16:25:33
1219
10
原创 Java 网络编程(一) --- 概念,客户端和服务器通信代码实现
传输是尽力而为的,不一定是百分百送达的,如果传输失败,我这边是可以感知到的,也可以进行下次的传输。此处的连接本质上就是建立连接的双方,各自保存对方的信息。字节流:可以一次传一个,分多次传,也可以一次传10个,分多次传,也可以一次传输完。比如就像写代码一样,我们的代码写的越多,就越复杂,我们往往把代码拆成多个部分。receive,start一启动,数据还没有来,就执行receive,会阻塞。3. TCP 是面向字节流的,UDP是面向数据报的。比如买的衣架,可以用来晒衣服,还可以用来打人。
2025-09-17 09:55:00
1996
36
原创 Java 文件io
(可以理解函数是一个工厂,参数是原材料,返回值是生产的产品,而有时返回值不好表示生产产品,用了这个参数作为生产的产品)这个read会尽可能把cbuf这个数组给填满,如果实际上文件的内容填不满,也没关系,就直接把所有的数据都读出来就好了。定义的变量,会在try代码结束的时候(不管是正常结束,还是抛出异常)都会自动调用其中的close方法。但是大部分情况下,文件都是指硬盘的文件,文件就相当于是针对 ‘’ 硬盘 ''数据的一种抽象。文本文件和二进制文件的区分是非常重要的,代码编写的时候,
2025-09-14 20:14:18
1207
11
原创 Java 多线程进阶(四)-- 锁策略,CAS,synchronized的原理,JUC当中常见的类
偏向锁,如果没有人竞争这个锁,synchronized就标记一下,不加锁,就加上一个标记,这时如果要解锁也会更加高效,后续如果有锁竞争了就立马加上锁,也保证了线程安全问题。针对第一点,每个链表都是一把小锁,需要我们把每个链表的头节点作为一个锁对象,因为synchronized可以把任何对象作为锁对象。偏向锁的核心思想,就是’’ 懒汉模式 ‘’ 的另一种体现,能不加锁就不加锁,加锁就意味着有开销。CAP这里循环判定,如果值是有变化了,就是存在其他线程在这里穿插执行了,所以这里更新了一下值。
2025-09-13 17:45:46
1932
35
原创 Java 多线程(三)
线程池的优点:在使用第一个线程的时候,就把2,3,4,5线程创建好,后续想要使用新的线程就不必重新创建了,直接拿过来就能用(此时创建线程的开销就被降低了)此时这里的id每次循环都是一个新的id,并且每次循环都会赋值上一个初值,所以说每次的id是一个不变的值(final)需要有一个超时时间的wait等待,等待到下一个任务时间的开始,超时时间为下次任务时间减现在的系统时间。虽然线程对比进程是更高效了,但是线程频繁的创建和销毁,这样的开销也是不容忽视的。4. 四种类型的线程池:(前两个比较常用)
2025-09-12 15:00:03
1355
23
原创 Java 多线程(二)
比如服务器A和服务器B进行数据交互,A用来发送请求,B用来接收请求,A和B的耦合度比较高,如果B挂了的话,会影响到A,如果再加入一个C服务器,也和A交互,A的代码就需要进行修改。如果使用一个阻塞队列的话,A和B都把请求和响应放入阻塞队列中,A挂了不会影响B,再加入一个C也不需要修改A的代码。先写一个线程不安全的,再写一个加锁的,再写一个高性能,不要每次加锁的,最后写一个考虑指令重排序问题的。java的对象头:java的一个对象的内存空间中,除了你自己定义的属性之外,还有一些自带的属性,
2025-09-10 21:22:29
1225
24
原创 Java 多线程(一)
在你的Java代码中,当将线程设置为守护线程(setDaemon(true))后不打印任何内容,这是因为主线程退出时JVM会立即终止所有守护线程,而不等待它们执行完毕。你把一个函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,这就是回调函数。后台线程(守护线程):后台线程不结束,并不影响整个线程的结束,整个线程结束了,后台线程也就结束了。,比如在修改变量的同时,执行完了第一个sleep,需要再回到while的判断处结束新线程。,如果超过这个线程就不会等待了,不会死等下去。
2025-09-08 09:50:38
1621
33
原创 Java 模版进阶
getMessage()不可使用,使用时分不清是Fruit还是Food。不能使用setMessage(new Banana())因为Apple可以进行向上转型成Fruit或者是Food。可以使用setMessage(new Apple())因为Banana()不一定是对应的那个子类对象实例。所以要使用时要进行强转。
2025-08-05 20:47:45
452
2
原创 Java 字符串常量池 +反射,枚举和lambda表达式
枚举的构造方法默认是 private,即使你不写 private,编译器也会自动加上。5. 枚举对象非常安全,就算通过反射也不能创建一个枚举对象的。双引号引起的才会放入到常量池当中。枚举的实例必须在枚举内部显式定义。
2025-08-02 17:27:36
943
2
原创 Java Map和Set
HashMap是线程不安全的,因为采用了头插法,后面采用了尾插法变得安全了,ConcurrentHashMap是线程安全的,之后学到了线程就可以理解了。如果key是String,Person类型就不能除以数组的长度了,该怎么找到对应的下标呢?4. 扩容之后需要重新哈希,因为数组长度变了,要重新计算节点存放的位置。如果频率相同放入堆中要使用大根堆,要让love排在i的前面。5. 遍历哈希数组中每个数组元素,都要重新计算节点位置。cur是某个节点的左边。cur是某个节点的右边。要删除的节点是cur。
2025-08-01 10:16:51
1669
49
原创 Java 排序
先走左边的话,先遇到大的停下来,如果相遇的话,那么相遇位置的值就是大于基准元素的,这时候交换的话,6的左边有一个数比6大。只剩最后几层时,使用插入排序进行优化,降低递归次数,可以使用插入排序是因为前面递归成有序的序列了。合并:第一个有序段和第二个有序段,比较大小放入一个新的数组中。没有等于号,会死循环,比如两端都是6。分解:根据mid进行分解。
2025-07-28 12:08:19
2101
44
原创 Java 堆(优先级队列)
求最小的前k个元素,先把前k个元素建立大根堆,再和k+1位置的元素比较,如果小于堆顶元素就入堆,并且删除堆顶元素,以此类推,最后剩下的k个元素就是最小的元素。3. top-k问题的时间复杂度是:O(N * logK)priorityqueue:底层是一颗完全二叉树。
2025-07-23 22:52:40
1279
36
原创 Java 二叉树
N为总节点个数,n0,n1,n2都是度为0,1,2的节点个数。有n个节点的完全二叉树,有k层,那么k是多少?度为0的节点个数始终比度为2的节点个数多一个。2. 孩子双亲表示法:可以知道孩子的父亲是谁。那么父亲节点下标为:(i - 1) / 2。那么左孩子下标为:2 * i + 1。时间复杂度:O(min(M,N))二叉树最多有2^n - 1个节点。要求时间复杂度是O(N)的写法,每层最多有2^i - 1个节点。N个节点的二叉树有N-1条边。右孩子下标为:2*i + 2。已知父亲节点的下标为i。
2025-07-21 21:15:44
1461
31
原创 Java 栈和队列
add和offer都是入队,remove和poll都是删除元素,element和peek都是获取队头元素。rear =(rear + 1)% len 表示下一个位置的下标。队列:组织数据的方式是先进先出,队尾入数据,队头出数据。第一次相遇标记一下,第二次相遇再标记一下,证明是满了。如果front的下一个空间是rear,那么就是满。如果front == rear,那么就是空。rear + 1 == front 表示满。3. 如何判断队列是空和满?
2025-07-15 19:50:39
1147
10
原创 Javaee 多线程 --进程和线程之间的区别和联系
start方法调用的线程中的代码执行顺序由线程调度器决定,顺序不确定。3.调用start方法会执行新的线程,新线程和主线程并发执行,,run方法只是一个普通的方法,在主线程中执行。,start方法启动的线程和主线程。2.start方法只能。4.run方法和主线程。
2025-07-02 19:39:25
1046
51
原创 Java ArrayList顺序表 + 接口实现 + 底层
1.ArrayList实现了Collection接口,那么Collection接口可以引用ArrayList的对象。2.list泛型类的类型是?(通配符),它的上界要是list2的子类或者其本身,list传给c。对于ArrayList来说是1.5倍扩容,如果超过1.5倍大小,则按照用户所需大小进行扩容。引用类型可以用for循环一个一个置空,然后有效元素个数置为0。3. 只要实现了这个接口都可以传递给Collection。3. 扩容:第一次add会分配大小为10的内存。使用copyOf进行扩容。
2025-07-01 12:21:23
549
15
原创 Java 图书管理系统
先构造一个bookList对象,在构造一个user对象,返回登入的是管理员对象还是普通用户对象,循环里面是每次的(choice)选择,menu对应的是两个对象的动态绑定,doOperation每次调用对应选项的work方法。查找图书:遍历书架,将要找的图书的名字和书架上的书名进行比对,如果有就找到了,并打印信息,最后返回。定义成数组,可以更好地组织数据,数组里面存储的是各种类,可以调用的1,2,3,4方法。新增图书:从键盘上输入书的信息,把它放入到书的对象中,最后放到书架的最后一个位置。
2025-06-30 18:59:30
1146
38
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅