Java基础不牢地动山摇!
文章平均质量分 84
Java基础不牢地动山摇!
晴城丶
"我们读书是为了成为提灯人去照亮黑暗,而不是为了自己有灯而沾沾自喜还要去吹灭别人的蜡烛"
展开
-
75_从头到脚讲明白线程锁
如果一个锁是公平的,那么所有等待锁的线程都将按照它们发出请求的顺序获取锁,而不会有线程被饿死(永远无法获取到锁)的情况发生。如果锁是公平的,那么等待时间最长的线程将优先获得锁。当使用锁时,Java内存模型确保了在锁释放之前对共享变量的修改对其他线程是可见的,并且在锁获取之后,线程将看到其他线程在锁释放之前所做的修改。线程锁在分布式应用中是重中之重,当谈论线程锁时,通常指的是在多线程编程中使用的同步机制,它可以确保在同一时刻只有一个线程能够访问共享资源,从而避免竞争条件和数据不一致性问题。原创 2024-03-24 22:13:39 · 1033 阅读 · 0 评论 -
74_MybatisPlus框架
Unknown column ‘多出来的字段名称’ in ‘field list’利用注解,将exist设置为false,则生成sql语句查询的时候,就不会再查询该字段了。原创 2023-12-17 11:48:26 · 827 阅读 · 0 评论 -
73_Spring跨域处理与Swagger接口管理
另一种方案就是直接将所有的页面和静态资源单独放到代理服务器上(如Nginx),这样我们后端服务器就不必再处理静态资源和页面了,专心返回数据即可,而前端页面就需要访问另一个服务器来获取,虽然逻辑和明确,但是这样会出现跨域问题,实际上就是我们之前所说的跨站请求伪造,为了防止这种不安全的行为发生,所以对异步请求会进行一定的限制。但是这样的一个文档,我们也不可能单独写一个项目去进行维护,并且随着我们的后端项目不断更新,文档也需要跟随更新,这显然是很麻烦的一件事情,那么有没有一种比较好的解决方案呢?原创 2023-12-17 11:37:44 · 364 阅读 · 0 评论 -
72_SpringBoot邮件处理
通过了解SpringBoot框架,我们就可以在我们自己的Web服务器上实现更多更高级的功能。原创 2023-12-17 11:36:28 · 862 阅读 · 0 评论 -
71_SpringDataJPA核心技术
2LessThan1111After1Before1IsNullNullIsNotNullNotNullLike1NotLike11(参数与附加绑定)EndingWith1(参数与前缀绑定)Containing1(参数绑定以包装)OrderByNot1In1NotIn1TrueFalseIgnoreCase1)原创 2023-12-17 11:34:34 · 329 阅读 · 0 评论 -
70_Redis数据库
一个键值对除了存储一个String类型的值以外,还支持多种常用的数据类型。原创 2023-12-17 11:33:08 · 758 阅读 · 0 评论 -
69_Git版本控制
git init输入后,会自动生成一个.git目录,注意这个目录是一个隐藏目录,而当前目录就是我们的工作目录。git status这表示我们还没有向仓库中提交任何内容,也就是一个空的状态。原创 2023-12-17 11:09:46 · 337 阅读 · 0 评论 -
68_SpringBoot一站式开发
SpringBoot一站式开发官网:https://spring.io/projects/spring-bootSpring Boot可以轻松创建独立的、基于Spring的生产级应用程序,它可以让你“运行即可”。大多数Spring Boot应用程序只需要少量的Spring配置。SpringBoot功能:创建独立的Spring应用程序直接嵌入Tomcat、Jetty或Undertow(无需部署WAR包,打包成Jar本身就是一个可以运行的应用程序)提供一站式的“starter”依赖项,以简化M原创 2023-12-16 12:24:19 · 355 阅读 · 0 评论 -
67_MySQL高级
除了使用系统为我们提供的函数以外,我们也可以自定义函数,并使用我们自定义的函数进行数据处理,唯一比较麻烦的就是函数定义后不能修改,只能删了重新写。原创 2023-12-16 12:22:50 · 842 阅读 · 0 评论 -
66_SpringSecurity核心技术
前面我们已经了解了如何实现数据库权限验证,那么现在我们接着来看看,如何将登陆页面修改为我们自定义的样式。首先我们要了解一下SpringSecurity是如何进行登陆验证的,我们可以观察一下默认的登陆界面中,表单内有哪些内容:</</</</</</</</原创 2023-12-16 12:21:07 · 804 阅读 · 0 评论 -
65_SpringMVC核心技术
要知道C++岗位没有Java多,Java只是学的人太多。不代表他简单,他要学习的东西比C++多多了,而科班出身和培训出来的,大学不是这个计算机专业的,优势比的就是学习能力,计算机的组成,计算机底层工作原理,数据抽象代码的架构能力等等。原创 2023-12-16 12:10:42 · 412 阅读 · 0 评论 -
64_SpringIOC实现原理探究
实际上我们之前的所有操作都离不开一个东西,那就是IoC容器,那么它到底是如何实现呢?这一部分我们将详细介绍,首先我们大致了解一下ApplicationContext的加载流程:我们可以看到,整个过程极为复杂,一句话肯定是无法解释的。由于Spring的源码非常庞大,因此我们不可能再像了解其他框架那样直接自底向上逐行干源码了(各位可以自己点开看看,代码量非常多)我们需要先从几个非常小的点开始进行介绍,最后将所有点汇总才能瓦解整块拼图。//这是BeanFactory的一个默认实现类。原创 2023-12-16 12:09:23 · 828 阅读 · 0 评论 -
63_Spring整合Log4j2
【代码】63_Spring整合Log4j2。原创 2023-12-16 12:07:53 · 351 阅读 · 0 评论 -
62_Spring整合SpringMVC
【代码】62_Spring整合SpringMVC。原创 2023-12-16 12:06:54 · 352 阅读 · 0 评论 -
55_SpringJUnit单元测试
直接编写一个测试用例即可,但是这样的话,如果我们有很多个测试用例,那么我们不可能每次测试都去创建ApplicationContext吧?添加一个测试前动作来提前配置ApplicationContext,但是这样的话,还是不够简便,能不能有更快速高效的方法呢?注解来表示要加载哪一个配置文件,可以是XML文件也可以是类,我们这里就直接使用类进行加载。来进行依赖注入,并且直接在测试方法中使用注入的Bean,现在就非常方便了。注解,然后使用SpringTest模块提供的。是由JUnit提供的注解,等同于旧版本的。原创 2023-12-16 12:05:38 · 359 阅读 · 0 评论 -
61_Spring整合JdbcTemplate
【代码】61_Spring整合JdbcTemplate。原创 2023-12-16 12:04:02 · 329 阅读 · 0 评论 -
60_SpringTx事务管理
当两个事务同时在执行,并且同时在操作同一个数据,这样很容易出现并发相关的问题,比如一个事务先读取了某条数据,而另一个事务此时修改了此数据,当前一个事务紧接着再次读取时,会导致和前一次读取的数据不一致,这就是一种典型的数据虚读现象。这正是我们前面例子中提到的问题,虽然它避免了脏读问题,但是如果事件B修改并提交了数据,那么实际上事务A之前读取到的数据依然不是最新的数据,直接导致两次读取的数据不一致,这种现象称为。除了事务的传播规则,其他的内容其实已经给大家讲解过了,那么我们就来看看事务的传播。原创 2023-12-16 12:00:14 · 884 阅读 · 0 评论 -
59_Spring整合MyBatisPlus
【代码】59_Spring整合MyBatisPlus。原创 2023-12-16 11:57:48 · 302 阅读 · 0 评论 -
058_Spring整合JPA
【代码】058_Spring整合JPA。原创 2023-12-16 09:50:09 · 351 阅读 · 0 评论 -
57_Spring整合MyBatis
在mybatis-spring依赖中,为我们提供了SqlSessionTemplate类,它其实就是官方封装的一个工具类,我们可以将其注册为Bean,这样我们随时都可以向IoC容器索要对象,而不用自己再去编写一个工具类了,我们可以直接在配置类中创建。我们发现,在这里的定义就比非池化的实现复杂得多了,因为它还要考虑并发的问题,并且还要考虑如何合理地存放大量的链接对象,该如何进行合理分配,因此它的玩法非常之高级,但是,再高级的玩法,我们都要拿下。我们先来看看,不使用池化的数据源实现,它叫做。原创 2023-12-15 22:57:42 · 289 阅读 · 0 评论 -
56_SpringAOP面向切片
通过AOP我们可以在保证原有业务不变的情况下,添加额外的动作,比如我们的某些方法执行完成之后,需要打印日志,那么这个时候,我们就可以使用AOP来帮助我们完成,它可以批量地为这些方法添加动作。可以看到在我们原本的方法执行完成之后,它还继续执行了我们的增强方法,这实际上就是动态代理做到的,实现在不修改原有代码的基础上,对方法的调用进行各种增强,在之后的SpringMVC学习中,我们甚至可以使用它来快速配置访问日志打印。这样,我们就实现了环绕方法,通过合理利用AOP带来的便捷,可以使得我们的代码更加清爽和优美。原创 2023-12-15 22:56:08 · 747 阅读 · 0 评论 -
55_SpringEL表达式
如果遇到乱码的情况,请将配置文件的编码格式切换成UTF-8(可以在IDEA设置中进行配置)然后在@PropertySource注解中添加属性 encoding = “UTF-8” 这样就正常了,当然,其实一般情况下也很少会在配置文件中用到中文。是一种强大,简洁的装配 Bean 的方式,它可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用 JDK 中提供的静态常量,获取外部 Properties 文件中的的配置。这样,我们有时候在使用配置文件中的值时,就能进行一些简单的处理了。原创 2023-12-15 22:54:21 · 862 阅读 · 0 评论 -
54_Spring高级特性
这实际上Spring帮助我们动态生成的一个代理类,我们原本的类代码已经被修改了,当然,这只是冰山一角,更多的内容,我们还会再AOP面向切片部分中继续为大家进行介绍,能做到这样的操作,这其实都是AOP的功劳。监听实际上就是等待某个事件的触发,当事件触发时,对应事件的监听器就会被通知,如果你学习过Java Swing篇视频教程,应该会深有体会,监听器可是很关键的,只不过在Spring中用的不是很频繁罢了。类型的实例,并使用它来创建线程执行任务,这是Spring推荐的方式,当然,如果没有找到,那么会使用自带的。原创 2023-12-15 22:52:18 · 744 阅读 · 0 评论 -
53_SpringIOC容器
在JavaWeb阶段,我们已经学习了如何使用Java进行Web应用程序开发,我们现在已经具有搭建Web网站的能力,但是,我们在开发的过程中,发现存在诸多的不便,在最后的图书管理系统编程实战中,我们发现虽然我们思路很清晰,知道如何编写对应的接口,但是这样的开发效率,实在是太慢了,并且对于对象创建的管理,存在诸多的不妥之处,因此,我们要去继续学习更多的框架技术,来简化和规范我们的Java开发。SpringIOC核心容器Spring框架最核心的其实它的IoC容器,这是我们开启Spring学习的第一站。IoC原创 2023-12-15 22:50:42 · 907 阅读 · 0 评论 -
52_Web开发入门和Servlet
Tomcat(汤姆猫)就是一个典型的Web应用服务器软件,通过运行Tomcat服务器,我们就可以快速部署我们的Web项目,并交由Tomcat进行管理,我们只需要直接通过浏览器访问我们的项目即可。如果出现乱码,说明编码格式配置有问题,我们修改一下服务器的配置文件,打开conf文件夹,找到我们发现,官方已经给我们预设了一些项目了,访问后默认使用的项目为ROOT项目,也就是我们默认打开的网站。原创 2023-12-15 00:17:29 · 875 阅读 · 0 评论 -
51_Mybatis持久层框架
在前面JDBC的学习中,虽然我们能够通过JDBC来连接和操作数据库,但是哪怕只是完成一个SQL语句的执行,都需要编写大量的代码,更不用说如果我还需要进行实体类映射,将数据转换为我们可以直接操作的实体类型,JDBC很方便,但是还不够方便,我们需要一种更加简洁高效的方式来和数据库进行交互。**再次强调:**学习厉害的框架或是厉害的技术,并不是为了一定要去使用它,而是它们能够使得我们在不同的开发场景下,合理地使用这些技术,以灵活地应对需要解决的问题。原创 2023-12-15 00:16:56 · 793 阅读 · 0 评论 -
50_Maven
*注意:**开始之前,看看你C盘空间够不够,最好预留2GB空间以上!**吐槽:**很多电脑预装系统C盘都给得巨少,就算不装软件,一些软件的缓存文件也能给你塞满,建议有时间重装一下系统重新分配一下磁盘空间。Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。原创 2023-12-15 00:16:25 · 760 阅读 · 0 评论 -
49_JDBC操作数据库
通过Java如何去使用数据库来帮助我们存储数据呢,这将是本章节讨论的重点。原创 2023-12-15 00:15:29 · 775 阅读 · 0 评论 -
48_数据库SQL基础
数据库是数据管理的有效技术,是由一批数据构成的有序集合,这些数据被存放在结构化的数据表里。数据表之间相互关联,反映客观事物间的本质联系。数据库能有效地帮助一个组织或企业科学地管理各类信息资源。简而言之,我们的数据可以交给数据库来帮助我们进行管理,同时数据库能够为我们提供高效的访问性能。在JavaSE学习阶段中,我们学习了如何使用文件I/O来将数据保存到本地,这样就可以将一个数据持久地存储在本地,即使程序重新打开,我们也能加载回上一次的数据,但是当我们的数据变得非常多的时候,这样的方式就显得不太方便了。原创 2023-12-15 00:14:35 · 804 阅读 · 0 评论 -
47_Socket技术
在JavaSE阶段,我们学习了I/O流,既然I/O流如此强大,那么能否跨越不同的主机进行I/O操作呢?这就要提到Java的网络编程了。**注意:**本章会涉及到计算机网络相关内容(只会讲解大致内容,不会完整的讲解计算机网络知识)原创 2023-12-15 00:09:58 · 792 阅读 · 0 评论 -
44_设计模式
面向对象设计原则我们在进行软件开发时,不仅仅需要将最基本的业务给完成,还要考虑整个项目的可维护性和可复用性,我们开发的项目不单单需要我们自己来维护,同时也需要其他的开发者一起来进行共同维护,因此我们在编写代码时,应该尽可能的规范。如果我们在编写代码时不注重这些问题,整个团队项目就像一座屎山,随着项目的不断扩大,整体结构只会越来越遭。甚至到最后你会发现,我们的程序居然是稳定运行在BUG之上的…所以,为了尽可能避免这种情况的发生,我们就来聊聊面向对象设计原则。单一职责原则单一职责原则(Simple R原创 2023-12-15 00:05:26 · 860 阅读 · 0 评论 -
43_文件读写
File对象代表的是操作系统的文件系统里面的文件或者目录。创建File对象 可以根据相对路径创建,更可以指定一个绝对路径。在Window操作系统的文件管理中是有盘符,所以以盘符开头的的路径,就是文件的绝对路径。在Linux操作系统的文件管理是以为根路径,往下划分的。所以以开头的路径,就是文件的绝对路径。原创 2023-12-15 00:03:40 · 804 阅读 · 0 评论 -
42_时间API
日期的偏移,是Date对象一大痛点,而LocalDate,作为不可变对象很巧妙的化解这份尴尬,你需使用新的变量接受偏移后的日期即可,对于d1日期,不会造成任何的影响。第二点,使用参数从较粗粒度到较细粒度转换,如果参数为负,则在数字上溢出至 Long.MIN_VALUE,如果为正,则为 Long.MAX_VALUE。除了可以通过of()方法指定一个具体的日期 now()方法得到一个具体的日期之外,还可以通过其他的方式获取到LocalDate对象实例。将一个时间戳对象 转为秒值,也就是10位时间戳。原创 2023-12-15 00:03:10 · 333 阅读 · 0 评论 -
41_JDK17-21新特性介绍
包作为依赖时(包括JDK官方库),实际上很多功能我们并不会用到,但是由于它们是属于同一个依赖捆绑在一起,这样就会导致我们可能只用到一部分内容,但是需要引用一个完整的类库,实际上我们可以把用不到的类库排除掉,大大降低依赖库的规模。所以,与其说Lambda是匿名内部类的语法糖,不如说是我们为所需要的接口提供了一个方法作为它的实现。Java 11 是继Java 8之后的又一个TLS长期维护版本,在Java 17出现之前,一直都是此版本作为广泛使用的版本,其中比较关键的是用于Lambda的形参局部变量语法。原创 2023-12-15 00:01:41 · 2327 阅读 · 0 评论 -
40_HTTP客户端调用
在JAVA中,Java.net包里面的类是进行网络编程的。原创 2023-12-14 23:59:52 · 809 阅读 · 0 评论 -
39_系统命令调用
/创建一个指针给他分配 50 大小的内存空间//创建一个指针给他分配 20 大小的内存空间//二级指针存储的值。//30//60//hello world 王乃醒~~~~eeee~~eeee~~## 以接口形式调用嘿嘿,我们就能愉快的使用啦!!原创 2023-12-14 23:59:18 · 805 阅读 · 0 评论 -
38_安全密码学基础
安全密码学在了解安全密码学之前,我们需要补充一些额外知识。ASCII是基于拉丁字母的一套电脑编码系统,就好像这些字符,对应的就是十进制的65 97,简单来说就是计算机没有办法识别字符,他只理解01二进制,所以用一个字符表,规定了什么字符用什么01表示。 @Test public void ascii() { char c1 = 'A'; char c2 = 'a'; System.out.println((byte)c1);原创 2023-12-14 23:57:22 · 1159 阅读 · 0 评论 -
38_安全密码学
制作密钥KeyPairGenerator对于非对称加密,他区分公钥和私钥 我们可以用 KeyPairGenerator 来为我们生成秘钥对。我们根据一个算法名称得到该生成器,调用generateKeyPair() 来生成秘钥对现在我们来生成下RSA算法的秘钥对 @Test @DisplayName("通过算法 创建密钥对生成器") public void getInstanceByAlgorithm() throws NoSuchAlgorithmException {原创 2023-12-14 23:54:31 · 1001 阅读 · 0 评论 -
37_Java单元测试与断言
单元测试是将普通开发人员与优秀开发人员区分开来的最重要的事情。程序员经常得到不编写单元测试的借口,但避免单元测试的最常见借口是缺乏流行单元测试库的经验和知识,包括 JUnit、Mockito 和 PowerMock。首先一问:我们为什么需要单元测试?原创 2023-12-14 23:48:38 · 820 阅读 · 0 评论 -
36_JUL日志和三方日志框架
首先一问:我们为什么需要日志系统?我们之前一直都在使用来打印信息,但是,如果项目中存在大量的控制台输出语句,会显得很凌乱,而且日志的粒度是不够细的,假如我们现在希望,项目只在debug的情况下打印某些日志,而在实际运行时不打印日志,采用直接输出的方式就很难实现了,因此我们需要使用日志框架来规范化日志输出。而JDK为我们提供了一个自带的日志框架,位于我们发现,通过日志输出的结果会更加规范。原创 2023-12-14 23:48:02 · 889 阅读 · 0 评论