- 博客(54)
- 收藏
- 关注
原创 端口占用怎么办?解决一系列端口占用问题
在Windows系统中,若需解决端口占用问题,可先以管理员模式打开命令提示符,使用netstat -ano|findstr:端口号命令查找占用指定端口的进程ID(PID)。例如,查找8080端口的PID,输入netstat -ano|findstr:8080。找到PID后,使用taskkill /PID 进程ID /F命令结束该进程,如taskkill /PID 6408 /F。此方法能有效解决端口被占用的问题。
2025-05-16 09:36:35
104
原创 Spring与Web
-声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory-->配置监听器:目的是创建容器对象,创建了容器对象,就能把spring.xml配置文件中的所有对象都创建好。它的赋值,使用的是value,指定路径的文件,使用 classpath:表示文件的位置。--set注入,把数据库连接池付给了dataSource-->--声明数据源DataSource,作用是连接数据库的-->--指定sqlSessionFactory对象的id-->
2024-12-22 16:23:12
888
原创 Spring事务
适合大型项目,有很多的类,方法,需要大量的配置事务,使用aspectJ框架功能,在spring配置文件中声明类,方法需要的事务。指定的方法必须在事务内执行,若当前存在事务,就加入到当前事务中,若当前没有事务,则创建一个新事务。 spring给业务方法加入事务:在你的业务方法执行之前,先开启事务,在业务方法执行结束后提交或者回滚事务,使用aop的环绕通知。总是创建一个新事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。指定的方法支持当前事务,但若当前没有事务,也可以也非事务方式执行。
2024-12-22 16:22:14
904
原创 Spring集成MyBatis
-声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory-->--创建dao对象,使用SqlSession的getMapper(studentDao.class)它的赋值,使用的是value,指定路径的文件,使用 classpath:表示文件的位置。--set注入,把数据库连接池付给了dataSource-->--声明数据源DataSource,作用是连接数据库的-->--指定sqlSessionFactory对象的id-->
2024-12-22 16:21:37
855
原创 AOP面向切面编程
AOP (Aspect Orient Programming),面向切面编程。面向切面编程是从动态角度考虑程序运行过程。AOP底层,就是采用动态代理模式实现的。采用了两种代理: JDK的动态代理,与CGLIB的动态代理。AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,可通过运行期动态代理实现程序功能的统一维护的一种技术。AOP是Spring框架中的一个重要内容。
2024-12-22 16:21:02
861
原创 Spring框架-IOC控制反转
(Ioc,Inversion of Control),是一个概念,一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值,依赖的管理。IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式是依赖注入。应用广泛。classA 类中含有classB的实例,在classA中调用classB的方法完成功能,即classA对classB有依赖。
2024-12-22 16:19:22
1883
原创 网上书城数据库设计文档
UserID: 用户的唯一标识符。Username: 用户名,必须唯一。Password: 加密后的密码。Email: 用户的电子邮件地址,必须唯一。: 用户注册日期。BookID: 书籍的唯一标识符。ISBN: 国际标准书号,必须唯一。Title: 书籍标题。Author: 书籍作者。Price: 书籍价格。: 书籍出版日期。Publisher: 出版社。Stock: 库存数量。CategoryID: 分类的标识符。: 分类名称。OrderID: 订单的唯一标识符。
2024-12-21 20:18:43
710
原创 Springboot添加Filter
本质上就是通过代理,把Spring管理的Bean注册到Servlet容器中,不过步骤比较繁琐,需要配置。更简单了,可以做到零配置。因为我们要过滤URL,而不是针对所有URL生效,因此,在。中,这个内部类可以引用外部类的所有字段,自然也包括注入的。,所以,整个过程完全基于Spring的IoC容器完成。自动注册到Servlet容器中,无需任何配置。在Spring Boot中,添加一个。类型的Bean,然后,将它们返回的。中注入需要的资源,然后,在返回的。排序,数字小的在前面,所以,多个。的顺序是可以固定的。
2024-12-21 20:16:23
267
原创 springboot-禁用自动配置
Spring Boot大量使用自动配置和默认配置,极大地减少了代码,通常只需要加上几个注解,并按照默认规则设定一下必要的配置即可。例如,配置JDBC,默认情况下,只需要配置一个。但是,有时候,我们又必须要禁用某些自动配置。例如,系统有主从两个数据库,而Spring Boot的自动配置只能配一个,怎么办?,所以,这种设计的一个限制就是:在一个请求中,一旦切换了内部数据源,在同一个事务中,不能再切到另一个,否则,中,仍然按照Spring Boot默认的格式写,但。了,要实现主从数据库支持,怎么办?
2024-12-21 20:15:50
569
原创 Spring Boot入门-第一个SpringBoot应用
要了解Spring Boot,我们先来编写第一个Spring Boot应用程序,看看与前面我们编写的Spring应用程序有何异同。我们新建一个其中,在。
2024-12-21 18:52:40
847
原创 Web开发-Servlet入门
在上一节中,我们看到,编写HTTP服务器其实是非常简单的,只需要先编写基于多线程的TCP服务,然后在一个TCP连接中读取HTTP请求,发送HTTP响应即可。这些基础工作需要耗费大量的时间,并且经过长期测试才能稳定运行。如果我们只需要输出一个简单的HTML页面,就不得不编写上千行底层代码,那就根本无法做到高效而可靠地开发。因此,在JavaEE平台上,处理TCP连接,解析HTTP协议这些底层工作统统扔给现成的Web服务器去做,我们只需要把自己的应用程序跑在Web服务器上。一个Servlet总是继承自。
2024-12-21 18:51:11
567
原创 Java设计模式-抽象工厂
现在市场上有两家供应商:FastDoc Soft的产品便宜,并且转换速度快,而GoodDoc Soft的产品贵,但转换效果好。我们决定同时使用这两家供应商的产品,以便给免费用户和付费用户提供不同的服务。首先,FastDoc Soft必须要有实际的产品,即。然后,FastDoc Soft必须提供一个实际的工厂来生产这两种产品,即。注意到上面的抽象工厂仅仅是一个接口,没有任何代码。客户端要使用GoodDoc Soft的服务,只需要把原来的。外,其余代码只引用了产品接口,并未引用任何实际产品(例如,
2024-12-21 18:50:17
377
原创 Java设计模式(工厂方法)
工厂方法即Factory Method,是一种对象创建型模式。我们以具体的例子来说:假设我们希望实现一个解析字符串到Number的Factory而产品接口是Number返回的实际产品是BigDecimal。那么客户端如何创建呢?通常我们会在接口Factory中定义一个静态方法在客户端中,我们只需要和工厂接口以及抽象产品Number调用方可以完全忽略真正的工厂和实际的产品BigDecimal,这样做的好处是允许创建产品的代码独立地变换,而不会影响到调用方。有的童鞋会问:一个简单的parse()
2024-12-21 18:49:36
401
原创 MyBatis入门
MyBatis是一个半自动ORM(对象关系映射)框架,它封装了JDBC操作数据库的复杂性,使得开发者可以通过XML或注解的方式编写SQL语句,并通过对象和集合来表示数据库中的记录。创建一个Mapper接口,定义需要执行的方法:java。
2024-12-21 18:48:30
414
原创 JDBC查询
前面我们讲了Java程序要通过JDBC接口来查询数据库。JDBC是一套接口规范,它在哪呢?就在Java的标准库java.sql里放着,不过这里面大部分都是接口。接口并不能直接实例化,而是必须实例化对应的实现类,然后通过接口引用这个实例。那么问题来了:JDBC接口的实现类在哪?因为JDBC接口并不知道我们要使用哪个数据库,所以,用哪个数据库,我们就去使用哪个数据库的“实现类”,我们把某个数据库实现了JDBC接口的jar包称为JDBC驱动。
2024-12-21 18:45:31
931
原创 Maven入门到精通:从安装到项目构建
Maven是一个项目管理和构建自动化工具,它通过标准化项目结构和构建生命周期,简化了项目的构建过程,并提高了项目的可重用性。本文将详细介绍Maven的安装、配置以及如何在IDEA中创建和构建Maven项目。
2024-12-21 18:44:13
338
原创 Java线程锁
Java的线程锁是可重入的锁。什么是可重入的锁?观察修饰的add()方法,一旦线程执行到add()方法内部,说明它已经获取了当前实例的this锁。如果传入的n < 0,将在add()方法内部调用dec()方法。由于dec()方法也需要获取this锁,现在问题来了:对同一个线程,能否在获取到锁以后继续获取同一个锁?答案是肯定的。JVM允许同一个线程重复获取同一个锁,这种能被同一个线程反复获取的锁,就叫做。
2024-12-21 18:34:57
278
原创 Java高级(多线程基础)
Java语言内置了多线程支持。当Java程序启动的时候,实际上是启动了一个JVM进程,然后,JVM启动主线程来执行main()方法。在main()方法中,我们又可以启动其他线程。要创建一个新线程非常容易,我们需要实例化一个Thread实例,然后调用它的start()但是这个线程启动后实际上什么也不做就立刻结束了。我们希望新线程能执行指定的代码,有以下几种方法:方法一:从Thread派生一个自定义类,然后覆写run()执行上述代码,注意到start()方法会在内部自动调用实例的run()方法。
2024-12-21 18:34:25
382
原创 JAVA正则表达式(匹配规则)
正则表达式的匹配规则是从左到右按规则匹配。我们首先来看如何使用正则表达式来做精确匹配。对于正则表达式abc来说,它只能精确地匹配字符串"abc",不能匹配"ab""Abc""abcd"等其他任何字符串。如果正则表达式有特殊字符,那就需要用转义。例如,正则表达式a\&c,其中\&是用来匹配特殊字符的,它能精确匹配字符串"a&c",但不能匹配"ac""a-c""a&&c"等。要注意正则表达式在Java代码中也是一个字符串,所以,对于正则表达式a\&c来说,对应的Java字符串是"a\\&c",因为。
2024-12-21 18:11:54
1320
原创 Java日期与时间处理:深入理解与实践
本文将带你深入了解Java中日期和时间的处理,包括`java.util.Date`、`java.util.Calendar`、`java.time`(Java 8及以后版本)等。Java提供了丰富的API来处理日期和时间,从Java 8开始,`java.time`包更是极大地简化了日期和时间的操作。在Java 8之前,`java.util.Date`和`java.util.Calendar`是处理日期和时间的主要类。System.out.println("纽约时间: " + zonedDateTime);
2024-12-21 18:10:44
344
原创 Java IO流详解:从基础到高级应用
Java IO流基于两个核心接口:`InputStream`和`OutputStream`,分别用于处理输入和输出的字节流。从基础的文件操作到高级的对象序列化和线程间通信,Java IO流都是Java程序员必须掌握的技能之一。文件读写是IO流最基础的应用之一。- **处理流**:连接到其他流的顶端,对数据进行处理,如`BufferedReader`和`BufferedWriter`。- **节点流**:直接连接到数据源的流,如`FileInputStream`和`FileOutputStream`。
2024-12-21 18:08:00
244
原创 使用Set
我们知道,Map用于存储key-value的映射,对于充当key的对象,是不能重复的,并且,不但需要正确覆写equals()方法,还要正确覆写hashCode()方法。如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。SetSet<E>Set<E>实际上相当于只存储key、不存储value的Map。我们经常用Set用于去除重复元素。因为放入Set的元素和Map的key类似,都要正确实现equals()和hashCode()方法,否则该元素无法正确地放入Set。
2024-12-20 11:35:17
181
原创 编写hashCode方法
我们知道Map是一种键-值(key-value)映射表,可以通过key快速查找对应的value。以HashMap之所以能根据key直接拿到value,原因是它内部通过空间换时间的方法,用一个大数组存储所有value,并根据key直接计算出value如果key的值为"a",计算得到的索引总是1,因此返回value为,如果key的值为"b",计算得到的索引总是5,因此返回value为,这样,就不必遍历整个数组,即可直接读取key对应的value。
2024-12-20 11:34:43
407
原创 Map集合
我们知道,List是一种顺序列表,如果有一个存储学生Student实例的List,要在List中根据name查找某个指定的Student的分数,应该怎么办?最简单的方法是遍历List并判断name这种需求其实非常常见,即通过一个键去查询对应的值。使用List来实现存在效率非常低的问题,因为平均需要扫描一半的元素才能确定,而Map这种键值(key-value)映射表的数据结构,作用就是能高效通过key快速查找value(元素)。用Map来实现根据name查询某个StudentMap<K, V>
2024-12-20 11:33:44
381
原创 JAVA-List集合
在集合类中,List是最基础的一种集合:它是一种有序列表。ListList内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置,List的索引和数组一样,从0开始。数组和List类似,也是有序结构,如果我们使用数组,在添加和删除元素的时候,会非常不方便。例如,从一个已有的数组中删除索引为2这个“删除”操作实际上是把'C'后面的元素依次往前挪一个位置,而“添加”操作实际上是把指定位置以后的元素都依次向后挪一个位置,腾出来的位置给新加的元素。这两种操作,用数组实现非常麻烦。
2024-12-20 11:33:01
688
原创 java-extends通配符
不是的子类。假设我们定义了Pair<T>然后,我们又针对类型写了一个静态方法,它接收的参数类型是上述代码是可以正常编译的。注意:传入的类型是,实际参数类型是。既然实际参数是Integer类型,试试传入原因很明显,因为不是的子类,因此,不接受参数类型。但是从add()方法的代码可知,传入实际类型是Integer,引用类型是Number,没有问题。问题在于方法参数类型定死了只能传入。有没有办法使得方法参数接受?办法是有的,这就是使用使得方法接收所有泛型类型为Number或Number子类的Pair类型。
2024-12-20 11:32:25
428
原创 java擦拭法
泛型是一种类似”模板代码“的技术,不同语言的泛型实现方式不一定相同。Java语言的泛型实现方式是擦拭法(Type Erasure)。所谓擦拭法是指,虚拟机对泛型其实一无所知,所有的工作都是编译器做的。例如,我们编写了一个泛型类Pair<T>而虚拟机根本不知道泛型。<T>Object<T>所以,Java的泛型是由编译器在编译时实行的,编译器内部永远把所有类型T视为Object处理,但是,在需要转型的时候,编译器会根据T的类型自动为我们实行安全地强制转型。
2024-12-20 11:31:54
377
原创 java编写泛型
编写泛型类比普通类要复杂。通常来说,泛型类一般用在集合类中,例如,我们很少需要编写泛型类。如果我们确实需要编写一个泛型类,那么,应该如何编写它?可以按照以下步骤来编写一个泛型类。String然后,标记所有的特定类型,这里是String,把特定类型String替换为T,并申明<T>熟练后即可直接从T开始编写。
2024-12-20 11:31:13
224
原创 JAVA使用泛型
使用ArrayList时,如果不定义泛型类型时,泛型类型实际上就是Object此时,只能把<T>当作Object使用,没有发挥泛型的优势。当我们定义泛型类型<String>后,List<T>的泛型接口变为强类型当我们定义泛型类型<Number>后,List<T>的泛型接口变为强类型编译器如果能自动推断出泛型类型,就可以省略后面的泛型类型。编译器看到泛型类型就可以自动推断出后面的的泛型类型必须是。
2024-12-20 11:25:05
127
原创 什么是泛型(JAVA)
在讲解什么是泛型之前,我们先观察Java标准库提供的ArrayList,它可以看作“可变长度”的数组,因为用起来比数组更方便。实际上ArrayList内部就是一个Object[]如果用上述ArrayList存储String要解决上述问题,我们可以为String单独编写一种ArrayList这样一来,存入的必须是String,取出的也一定是String问题暂时解决。然而,新的问题是,如果要存储Integer,还需要为Integer单独编写一种ArrayList。
2024-12-20 11:24:48
281
原创 Java反射 动态代理
我们来比较Java的class和interfaceclassabstractinterface所有interface有没有可能不编写实现类,直接在运行期创建某个interface的实例呢?这是可能的,因为Java标准库提供了一种动态代理(Dynamic Proxy)的机制:可以在运行期动态创建某个interface的实例。什么叫运行期动态创建?听起来好像很复杂。所谓动态代理,是和静态相对应的。我们来看静态代码怎么写:这种方式就是我们通常编写代码的方式。还有一种方式是动态代码,我们仍然先定义了接口。
2024-12-20 11:08:12
364
原创 Java反射获取继承关系
当我们获取到某个Class还可以用实例的getClass()最后一种获取Class的方法是通过,传入Class这三种方式获取的Class实例都是同一个实例,因为JVM对每个加载的Class只创建一个Class实例来表示它的类型。
2024-12-20 11:07:40
340
原创 Java反射调用构造方法
的局限是,它只能调用该类的public无参数构造方法。如果构造方法带有参数,或者不是public,就无法直接通过。总是当前类定义的构造方法,和父类无关,因此不存在多态的问题。对象,它包含一个构造方法的所有信息,可以创建一个实例。为了调用任意的构造方法,Java的反射API提供了。
2024-12-20 11:05:48
235
原创 Java反射-调用方法
我们已经能通过Class实例获取所有Field对象,同样的,可以通过Class实例获取所有Method信息。Class类提供了以下几个方法来获取MethodpublicMethodMethodpublicMethodMethod上述代码首先获取Student的Class实例,然后,分别获取public方法、继承的public方法以及private方法,打印出的Method一个MethodgetName()"getScore"int。
2024-12-20 11:05:23
743
原创 Java基础-访问字段
对任意的一个Object实例,只要我们获取了它的Class,就可以获取它的一切信息。我们先看看如何通过Class实例获取字段信息。Class上述代码首先获取Student的Class实例,然后,分别获取public字段、继承的public字段以及private字段,打印出的Field一个FieldgetName()"name"getType()Classint以String类的value。
2024-12-20 11:03:53
843
原创 Class类
除了int等基本类型外,Java的其他类型全部都是class(包括interfaceclass(包括interface)的本质是数据类型(Type而class是由JVM在执行过程中动态加载的。JVM在第一次读取到一种class类型时,将其加载进内存。每加载一种class,JVM就为其创建一个Class类型的实例,并关联起来。注意:这里的Class类型是一个名叫Class的class。以String类为例,当JVM加载String类时,它首先读取文件到内存,然后,为String类创建一个Class这个。
2024-12-20 11:03:22
768
原创 Java基础-模块
从Java 9开始,JDK又引入了模块(Module)。什么是模块?这要从Java 9之前的版本说起。我们知道,.class文件是JVM看到的最小可执行文件,而一个大型程序需要编写很多Class,并生成一堆.class文件,很不便于管理,所以,jar文件就是class文件的容器。在Java 9之前,一个大型Java程序会生成自己的jar文件,同时引用依赖的第三方jar文件,而JVM自带的Java标准库,实际上也是以jar文件形式存放的,这个文件叫rt.jar,一共有60多M。
2024-12-19 13:35:25
796
原创 class版本
在Java开发中,许多童鞋经常被各种版本的JDK搞得晕头转向,本节我们就来详细讲解Java程序编译后的class文件版本问题。我们通常说的Java 8,Java 11,Java 17,是指JDK的版本,也就是JVM的版本,更确切地说,就是java.exe而每个版本的JVM,它能执行的class文件版本也不同。例如,Java 11对应的class文件版本是55,而Java 17对应的class文件版本是61。
2024-12-19 13:34:38
767
原创 classpath和jar
在Java中,我们经常听到classpath这个东西。网上有很多关于“如何设置classpath”的文章,但大部分设置都不靠谱。到底什么是classpath?classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class。因为Java是编译型语言,源码文件是.java,而编译后的.class文件才是真正可以被JVM执行的字节码。因此,JVM需要知道,如果要加载一个的类,应该去哪搜索对应的文件。所以,classpath就是一组目录的集合,它设置的搜索路径与操作系统相关。
2024-12-19 13:33:17
913
原创 Java基础-内部类
还有一种类,它被定义在另一个类的内部,所以称为内部类(Nested Class)。Java的内部类分为好几种,通常情况用得不多,但也需要了解它们是如何使用的。
2024-12-19 13:32:38
917
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人