- 博客(81)
- 收藏
- 关注
原创 实现 MyBatis 底层机制【 封装 Sqlsession到执行器 + Mapper 接口和 Mapper.xml + MapperBean + 动态代理Mapper的方法
mybatis-config.xml: 进行全局配置,全局只能有一个这样的配置文件,XxxMapper.xml 配置多个 SQL,可以有多个 XxxMappe.xml 配置文件。在sqlSession包中增加方法,该类主要是实现 InvocationHandler 接口并重写动态代理对象调用的invoke方法,这个方法采用硬编码的方式,之后再完善。2、配置pom.xml文件(注意MySQL的版本,自己的版本是8.0,有些人的版本是5.1的)实现接口execute,用于封装SQL语句的查询方法。
2025-04-09 16:46:12
536
原创 实现 SpringMVC 底层机制【 核心分发控制器+ Controller 和 Service 注入容器 + 对象自动装配 + 控制器方法获取参数 + 视图解析 + 返回 JSON 格式数据 】
创建controller类 MonsterControllertry {writer.write("<h1>你好</h1>");创建自定义注解 Controller创建注解RequestMapping功能说明: : 如果给某个类加上, @Service, 则可以将其注入到我们的 Spring 容器编写自定义注解@Service/*** 该注解用于将Service层的对象注入到容器*/增加一个Service层@Service。
2025-04-03 16:14:10
528
原创 手动实现 Spring 底层机制 【初始化 IOC容器+ 依赖注入+BeanPostProcessor 机制+AOP】
最后在测试类中调试得到singleton中也有后置处理器对象,因为在原生的容器中,后置处理器是被当作一个主键 经历createBean和getBean方法,相当于将该后置处理器对象存储在singleton对象中然后再从该对象取出进行调用,但是现在为了方便调用后置处理器的方法,就直接将该对象放入list集合中,并在createBean方法中的初始化方法前后调用before和after方法。原生的后置处理器即使你返回的结果是空,他也不影响原来的初始化的对象。
2025-03-27 16:47:59
737
原创 手写简单的Spring基于注解配置的程序
新建一个包用于存放自己手写的程序创建一个自定义注解:ComponentScan/*** 这个自定义的注解的作用相当于原配置文件中的component-scan* @Target(ElementType.TYPE)表示该注解作用的对象* @Retention(RetentionPolicy.RUNTIME)表示该注解的生命周期表示注解的属性value用于存放包名(即:要扫描的包路径),默认是空字符串*/
2025-03-22 13:14:21
448
原创 韩顺平教育-家居网购
注意细节:1、将html修改为jsp文件时一定要加上下面的声明标签,否则会出现乱码!!!注意下载地址:https://download.youkuaiyun.com/download/2401_83418369/90467290MVC 全称。
2025-03-16 09:24:50
634
原创 tomcat的安装与配置(包含在idea中配置tomcat)
JDK 版本 下载对应的 Tomcat 版本对照表下载官网:Apache Tomcat® - Welcome!JDK 版本兼容的 Tomcat 版本支持范围说明早期兼容已淘汰,仅供历史参考。JDK 1.4JDK 1.4+Tomcat 5.5 需 JDK 1.4 或更高。JDK 5.0+Tomcat 6.x 最低需 JDK 5.0。Java SE 6JDK 6+Tomcat 7.x 需 JDK 6+(推荐 JDK 7+)。
2025-03-05 20:45:40
1553
3
原创 c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)
数据库连接池是在应用程序启动时创建一定数量的数据库连接,并将这些连接存储在池中。当应用程序需要与数据库通信时,它可以向池中请求一个连接,使用完后将连接归还给池,而不是关闭连接。这样可以减少创建和关闭连接的开销,提高应用程序的性能。
2025-02-21 07:00:00
1799
原创 jdbc连接mysql(5种连接方式,循序渐进!!!)
方法一:直接实例化Driver(静态加载)实现步骤直接创建对象通过方法传递URL和Properties@Test// 显式依赖MySQL驱动类// 直接调用connect方法注意事项:2、URL格式是:jdbc:mysql://主机:端口/数据库名3、MySQL用户名和密码要填自己的,不要写错了方法二:反射动态加载Driver实现步骤通过反射加载驱动类实例化Driver对象后调用connect()@TestClass<?
2025-02-20 15:23:37
1325
原创 坦克大战项目(超详细!!!循序渐进!!!)
项目是一个涉及图形界面、事件驱动编程和算法设计的经典游戏项目。本项目由韩顺平教育开源结合自己的经验总结改编而成。有任何问题可以发表评论!!!
2024-12-10 12:30:57
1035
原创 Centos7 dhcp服务的搭建(超详细)
本期是两台Centos7系统在仅主机模式下搭建dhcp服务1、确保server的网络适配器为仅主机模式
2024-12-06 15:22:08
1135
原创 dhcpd服务器的配置与管理(超详细!!!)
网络中的DHCP服务器收到来自客户端的DHCP Discover报文后,会从IP地址池中挑选一个尚未出租的 IP 地址预分配给 DHCP客户端,并且在网络上广播一个DHCP Offer 响应报文,该报文包含了客户端的MAC地址、服务器所提供的IP地址、子网掩码、租用期限,以及DHCP 服务器本身的 IP 地址。客户端在向服务器请求一个IP地址时,如果DHCP 服务器的IP地址数据中能提供IP,则登记IP信息并分配这个地址给客户端使用,顺带相关的配置选项。按需求进行环境准备和信息采集,如表所示。
2024-12-02 20:58:47
2742
原创 vsftpd 的安装和应用(超详细!!!)
FTP(File Transfer Protocol,文件传输协议)是一种用于在计算机网络上进行文件传输的标准协议。它允许用户从一台计算机向另一台计算机上传或下载文件。FTP的工作原理涉及到客户端和服务器之间的交互,以及数据传输的过程。
2024-11-29 20:14:23
3106
原创 CentOS7 NAT模式不能联网(成功解决!!!)
虚拟机联网的详细过程:虚拟网络接口:假设我们在宿主机上使用VirtualBox或VMware等虚拟化软件创建了一个虚拟机,并为该虚拟机分配了一个虚拟网络接口(通常是虚拟网卡)。NAT转换器:宿主机上会运行一个NAT转换器,它负责将虚拟机的内部IP地址转换为主机的外部IP地址。以下是具体的联网过程:步骤1:虚拟机发起网络请求虚拟机内部的应用程序发起一个网络请求,比如尝试访问一个网站步骤2:虚拟机内部网络栈处理虚拟机的操作系统将请求发送到其网络栈,然后通过虚拟网络接口发出。步骤3
2024-11-26 20:37:07
3541
原创 单列集合Collection和双列集合Map(超全面解析)
ArrayList:适用于读操作频繁、插入删除操作较少的场景,查询效率高,插入删除效率低。它是大多数情况下的首选实现。LinkedList:适用于插入和删除操作频繁,尤其是列表两端插入删除操作较多的场景。由于是链表结构,查询效率较低。Vector:与ArrayList类似,但内置同步机制使其线程安全。由于同步的开销,Vector性能较差,不推荐在单线程环境下使用。HashSet:适用于需要快速查找、插入和删除元素的场景,但不关心元素的顺序。:适用于需要保持插入顺序的场景,同时保持HashSet。
2024-11-23 18:58:17
1835
原创 线程的概述
Thread类是 Java 中实现并发编程的核心,通过创建多个线程可以实现任务的并发执行。我们可以通过继承Thread类或实现Runnable接口来创建线程。多线程的同步机制(如)确保了共享资源的安全性。线程的优先级可以通过方法进行调整,但最终的调度还是由操作系统来决定。
2024-11-18 18:13:41
977
原创 HashSet中remove方法的底层原理
如果不为空,再次判断hash值是否相等,如果hash值相等,再次判断是否认是同一对象,如果是同一对象就不添加,否则添加到链表上。这段代码后name修改成功,但是hash值还是原来根据name="tom"和id=1001计算出来的值,即hash=3567790。因为计算出来的hash值不同,所以通过 & 按位与计算出来的索引也可能不同,那么索引对应table数组里的Node节点就可能为空,那么就删除失败。如图:通过debug调式,在断点前,p1对象被存储到索引为14的节点上,hash值为3567790。
2024-11-15 16:40:59
1202
原创 字符串常量池(详解)
字符串常量池是Java运行时环境(JRE)的一部分,它用于存储字符串字面量。字符串字面量是源代码中直接用双引号括起来的字符串,例如"hello"。在Java中,字符串是不可变的,这意味着一旦创建了一个字符串对象,它的值就不能改变。当Java编译器遇到字符串字面量时,它会将这些字面量放入字符串常量池中。如果常量池中已经存在相同的字符串字面量,编译器会复用已有的字符串对象,而不是创建一个新的对象。这样做可以节省内存,并提高性能。
2024-11-06 22:35:42
1498
原创 成员内部类、静态内部类、局部内部类和匿名内部类(超详细!!!)
public class A{//外部类static class B{//静态内部类public class A{//外部类static class B{//静态内部类public void print(){//访问外部类的非静态成员需要创建外部类的对象//这是一个内部类,定义在inner方法中//这是一个内部类,定义在代码块中//这是一个内部类,定义在inner方法中//访问外部类的私有属性hi();//访问外部类的私有方法10hi。
2024-11-03 12:23:39
1504
原创 模板设计模式(详解!!!)
模板设计模式(Template Pattern)是一种行为设计模式,在软件设计中有着广泛的应用,旨在提高代码的可维护性和可复用性。模板设计模式定义了一个算法的骨架,将某些步骤推迟到子类中实现。这样,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
2024-10-30 19:59:38
1213
原创 final关键字(详解!!!)
在Java中,关键字是一个用于定义不可变性的关键字,它可以应用于变量、方法和类。 当一个变量被声明为时,它的值一旦被初始化就不能被改变。对于基本数据类型,这意味着数值本身不能改变;对于对象引用,这意味着引用不能指向一个新的对象,但对象本身的状态(即对象内部的数据)仍然可以改变。代码演示:final修饰的属性一般在定义时赋值,并且以后不能再修改,赋值可以在如下位置之一:1.定义时赋值2.在构造器中赋值3.在代码块中赋值如果final修饰的属性是静态的,那
2024-10-30 12:53:17
1350
原创 详解:类什么时候加载?
在Java编程语言中,类的加载(Class Loading)是Java虚拟机(JVM)将类的字节码从文件或其他来源(如网络)加载到JVM(Java虚拟机)内存中,并转化为运行时数据结构(如对象)的过程。这个过程通常发生在程序运行时,但也可以在特定条件下提前发生。类的加载时机取决于多种因素,包括代码的执行路径、类的访问权限以及JVM的启动参数等。下面我将用static。
2024-10-28 13:25:07
1047
原创 详解:普通代码块和static代码块
普通代码块定义:在方法、循环、判断等语句中出现的代码块,通常用花括号{}包围。位置:可以出现在方法体内除()外的任何地方,包括方法体内部、循环体内部、判断语句内部等。static代码块定义:在类中定义并使用static关键字修饰的代码块。位置:它不能出现在方法体或者其他代码块内,只能位于类体中。普通代码块:随着对象的创建而执行,用于初始化实例变量或执行一些需要在对象创建时进行的操作。每次创建对象都会执行一次。static代码块。
2024-10-28 13:24:16
1197
原创 详解:this和super的区别
作用对象this引用当前对象,super引用当前对象的直接父类。用途this主要用于解决成员变量与局部变量名冲突、调用另一个构造器、返回当前对象的引用;super主要用于访问父类的成员(字段和方法)、调用父类的构造器。使用场景this通常用于当前类内部,super通常用于子类内部访问父类。在继承关系的条件下,如果子类没有和父类一样的非私有属性和方法(访问修饰是默认、protected或public的),子类可以通过this或super调用父类的属性和方法。
2024-10-24 10:36:43
1326
原创 成功解决:ERROR: transport library not found: dt_socket
如果你在开发环境中使用了某个版本的JDK来编译和构建应用程序,但是在调式运行时使用了不同版本的JRE,可能会出现兼容性问题。确保你使用的JDK和JRE版本是兼容的,想深入了解的小伙伴可以点击下面的博客。这个错误表明JVM无法找到用于调试的传输库,其实是JDK(Java开发工具的版本)和JRE(Java运行环境)不匹配。
2024-10-22 13:18:45
1437
原创 详解equals底层原理
Person person1=new Person("小明",18);Person person2=new Person("小明",18);比较是否是同一个对象。代码是用“==”来进行比较,当用于对象时,==检查两个引用是否指向内存中的同一个对象,显然person1和person2是两个不同的对象(变量名不同)。如果我们想要有一个Person类,并且你想要比较两个Person对象是否具有相同的名字和年龄,那么你需要重写equals方法来比较这些属性,而不是仅仅比较它们的引用。
2024-10-20 22:29:21
1000
原创 bash脚本(详解!!!)
bin/bash# 定义函数 greetgreet() {# 调用函数 greet 并传递参数 "World"或者/bin/bash# 定义函数 greet# 调用函数 greet 并传递参数 "World"在这个例子中,greet是一个接受一个参数的函数。当你调用时,它会在屏幕上打印 “Hello, World!结果如下:如果你想要在终端上输入你想要的内容可以加上read 命令/bin/bash# 定义函数 greet# 调用函数 greet 并传递参数 "World"
2024-10-20 07:30:00
2432
原创 rpm 命令(详解!!!)
rpm(Red Hat Package Manager)是 Red Hat Linux 及其衍生发行版(如 CentOS、Fedora)中用于管理软件包的系统。它允许用户安装、卸载、升级、查询和验证软件包。
2024-10-19 07:45:00
6933
原创 tree命令的安装(最新!!!成功解决!!!)
声明:我的虚拟机是centos7系统所以下面是用centos系统的方法安装tree,前提:虚拟机可以连网
2024-10-19 07:30:00
3003
9
原创 firewall 命令(详解!!!)
在使用时,可能需要root权限。如果不是root用户,需要在命令前添加sudo。使用参数设置的规则在重新加载防火墙后生效,如果不使用该参数,则规则仅在当前会话中有效。在较新的Linux发行版中,firewalld服务通常默认安装并激活,但在一些情况下,系统可能使用其他防火墙管理工具,如iptables。
2024-10-18 07:15:00
1272
原创 systemd服务控制
服务控制是指在操作系统中管理服务(system services)的过程,这些服务是执行指定系统功能的程序、例程或进程,以便支持其他程序,尤其是底层(接近硬件)程序。
2024-10-17 07:30:00
873
原创 进程和作业管理
进程是指一个具有独立功能的程序的一次运行过程,也是系统进行资源分配和调度的基本单位,即每个程序模块和它执行时所处理的数据组成了进程。进程虽不是程序,但由程序产生。进程与程序的区别在于:程序是一系列指令的集合,是静态的概念,而进程则是程序的一次运行过程,是动态的概念;程序可以长期保存,而进程只能暂时存在、动态地产生、变化和消亡。进程和程序并不是一一对应的,一个程序可以包含若干个进程,一个进程也可以调用多个程序。:进程是动态的,程序是静态的,当程序运行时就会占用CPU内存空间来执行程序,执行的动态过程就是进程。
2024-10-16 07:15:00
1197
原创 磁盘管理的shell命令
free命令是Linux系统中用于查看内存使用情况的工具。它可以显示系统中物理内存、交换空间(swap)以及内核使用的缓冲区和缓存的大小和利用率。
2024-10-16 07:00:00
1290
原创 创建磁盘并进行分区
在Linux系统中,创建磁盘并进行分区的步骤通常包括确认磁盘设备、创建磁盘、创建分区表、格式化分区、创建挂载点以及挂载分区等。以下是一个详细的步骤说明及示例: 是一个在 Linux 和其他类 Unix 操作系统中用于列出所有块设备及其属性的命令。这个命令非常有用,因为它可以显示设备的挂载点、文件系统类型、大小等信息,帮助用户了解系统的存储设备布局。 (1)、 在终端中直接输入 ,将显示系统中所有块设备的列表,包括硬盘、分区、光盘驱动器、RAM 盘等。输出通常包括设备名称、主要/次要
2024-10-15 17:28:25
3331
原创 计划任务服务程序
计划任务服务程序,在Linux系统中通常指的是cron服务。cron是一个基于时间的任务调度程序,它可以在无需人工干预的情况下,在指定的时间执行任务。
2024-10-15 09:24:19
1235
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人