SpringMVC 框架
一、SpringMVC 介绍
0 什么是 MVC
知识回顾:Appli Web课程笔记 - MVC
1 什么是 SpringMVC
在 Spring 中我们重点介绍了数据访问层 dao 与业务逻辑层 service 通过 Spring 框架的实现。SpringMVC 是 Spring 的一个子项目,是表述层 Controller 的一整套完备解决方案。
在如上的设计中:
controller 负责请求和数据的接收,接收后将其转发给 service 进行业务处理
service 根据需要会调用 dao 对数据进行增删改查
dao 把数据处理完后,将结果交给 service,service再交给 controller
controller 根据需求将 Model和 View 组合起来生成页面,转发给前端浏览器
这样做的好处就是 controller 可以处理多个请求,并对请求进行分发,执行不同的业务操作。
随着互联网的发展,上面的模式因为是同步调用,性能慢慢的跟不需求,所以异步调用 成为了如今流行的一种处理方式,如下图所示
因为是异步调用,所以后端不需要返回 View 视图 ...
MyBatis
本文主要通过以下几个方面来系统的介绍 MyBatis 框架:
零、MyBatis简单介绍
一、搭建 MyBatis 环境
二、核心配置文件详解
三、MyBatis 中的基本使用
四、自定义映射 resultMap
五、动态 SQL
六、MyBatis 中的分页
七、MyBatis 的缓存机制
八、MyBatis 与 Spring 框架整合
参考资料:
哔哩哔哩:“尚硅谷” 2022 版 MyBatis 入门教程
MyBatis 官方中文开发文档
学习 MyBatis 框架时的练习代码 GitHub : MyBatis_Demo
零、MyBatis简单介绍
MyBatis 是一个基于 Java 的持久化框架,支持定制化 SQL(自行编写 SQL 语句维护数据库)、存储过程及高级映射。它几乎避免了所有的 JDBC 代码和获取结果集。
与其他持久化层技术的对比
JDBC:SQL 语句于业务语句耦合度高,不易更改维护;代码冗长
JPA/Hibernate:操作便捷,开发效率高;但是因为 SQL 语句是自动生成的,不容易做特殊优化
MyBatis:轻量级,SQL 与 J ...
Java中线程池的使用及分析
我们可以思考如下场景:线程是一个系统资源,操作系统每分配一个线程,就会消耗一定的资源。如果在高并发的环境下, 我们为每个任务都创建一个线程的话,那么对资源的消耗时非常大的。为了减小在这中环境下的系统消耗,我们引入线程池概念来维护多个线程,将任务分配给线程池中的线程。
什么是线程池?
线程池其实就是一种多线程处理的形式,处理过程中可以将任务添加到到队列中,然后在创建线程后自动启动这些任务。
使用线程池的优势:
使用线程池可以统一的管理线程和控制线程并发数量;
可以与任务分离,提升线程重用度;
提升系统的响应速度
我们主要通过一下几个部分来介绍 Java 中的线程池:
自定义线程池
JDK 提供的线程池:ThreadPoolExecutor
设计模式 - 工作线程
一、自定义线程池
我们在介绍 JDK 提供的线程池之前,先自定义一个线程池,以更好的了解线程池的工作方式。
我们可以回忆一下生产者消费者问题,线程池其实就符合这个模型。线程池中的线程 thread 就是消费者,阻塞队列中的任务 task 就是商品,产生任务的线程 main 就是生产者。如下图
下面我们分别实现上述 ...
Java中的锁:乐观锁
写在前面:
我们在学习 Java 并发编程 时已经知道, synchronized 的本质是对 ObjectMonitor 对象的操作。在本章中我们会讲解一种相对于 Monitor(悲观锁)来实现线程安全的模式(乐观锁)。但碍于学识浅薄,文章中难免会出现错误,恳请各位读者加以指正。
我们主要通过以下几个方面来系统的介绍“乐观锁”的实现原理:
CAS 与 violate
原子整数 AtomicInteger
原子引用 AtomicReference
原子数组 AtomicArray
原子累加器
Unsafe 类
相关资料:
关于 ObjectMonitor 的底层源码分析
Java 中的锁:ReentrantLock
Java 内存模型 - JMM
0 引出问题
我们思考这样一个场景:
对于一个临界区数据 count,分别有两个线程对 count 进行增减操作。
如果我们使用 synchronized 关键字来对 count 进行保护,简易代码如下:
12345synchronized class Count { int num; public void i ...
Java中的锁:ReentrantLock
写在前面:
本人在学习 Java 并发编程 学习到一种除了 synchronized 用得较多的一种锁 ReentrantLock,本文旨在学习研究 ReentrantLock 相关知识,如 AbstractQueuedSynchronizer(简称 AQS),Lock 接口等。但碍于学识浅薄,文章中难免会出现错误,恳请各位读者加以指正。
本文主要通过以下几个方面来系统的介绍 ReentrantLock:
AQS 同步器
基于 AQS 自定义一个阻塞式的锁
ReentrantLock
ReentrantReadWriteLock 读写锁
AQS
ReentrantLock 继承自 AbstractQueuedSynchronizer(简称 AQS),所以我们从 AQS 开始讲起。
AQS (抽象的、基于队列的同步器)是**阻塞式锁和相关同步器工具**的框架,即其他的同步器工具都是它的子类,且基于 AQS 实现的锁是阻塞式的锁。
AQS 的特点有:
用 state 属性(volatile int)来表示资源的状态,分为独占模式 (只有一个线程访问一个资源)和共享模式(可以有多 ...
关于ObjectMonitor的底层源码分析
写在前面:
本人在学习 Java 并发编程时,对于 synchronized 关键字最底层的重量级锁 Monitor 的实现过程兴趣颇高,所以写下这篇文章记录学习过程。但碍于学识浅薄,文章中难免会出现错误,恳请各位读者加以指正。
文章末尾有本人根据源码分析得出的获取 Monitor 流程图,点击此处跳转。
主要参考资料:
ObjectMonitor 头文件:jdk8.runtime.objectMonitor.hpp
ObjectMonitor 源文件:jdk8.runtime.objectMonitor.cpp
知乎:深入底层源码 - 深度理解 synchronized 原理
Java多线程-对象内置锁(ObjectMonitor)
Java 的对象头结构
首先我们先回顾一下关于 Java 的对象头结构。
在一个 32 bits 的机器中,普通对象的 Java 对象头由 Mark Word 和 Klass Word 组成,一共 64 bits:
12345|---------------------------------------------------------|| ...
JMM - Java 内存模型
首先,我们应该区分【JVM 内存结构】和【JMM 内存模型】的区别。我们常说的 【JVM 内存结构】指的是JVM 的内存分区;而 【JMM 内存模型】是一种虚拟机规范。
简单的说,JMM 定义了一套在多线程读写共享数据时(成员变量、数组)时,对数据的可见性、有序性和原子性的规则和保障。
本文主要通过以下几个方面来系统的介绍 JMM 内存结构:
原子性
可见性
有序性
volatile 原理
0 Java 内存模型
Java 虚拟机规范中定义了 Java 内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让 Java程序在各种平台下都能达到一致的并发效果,JMM 规范了 Java 虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。
JMM 体现在以下几个方面
原子性 - 保证指令不会受到线程上下文切换的影响
可见性 - 保证指令不会受 CPU 缓存的影响
有序性 - 保证指令不会受 CPU 指令并行优化的影响
volatile 原理
...
Java的23种设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的,是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式分为三种类型,共23种:
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、责任链模式、访问者模式。
创建型模式
创建型模式的主要关注点是“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。
这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。
创建型模式分为:
单例模式
工厂方法模式
抽象工厂模式
原型模式
建造者模式
单例模式
所谓类的单例设计模式,就是采取一定的方法保证在整个软件系统中,对于某个类只能存在一个实例,该类负责创建自己的实例,并且该类只提供一个取得其实例的方法(静态方法)。
单例设计模式的实现方法 ...
Spring框架
零、Spring 简介
Spring 是分层的 Java SE/EE 应用轻量级全栈开源框架,以 IoC(反转控制)和 AOP(面向切面编程)为内核。
提供了展现层 Spring MVC和持久层 Spring JDBCTemplate 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架。
Spring 的优势
方便解耦,简化开发;
通过 Spring 框架提供的Bean IoC容器,可以将对象间的依赖关系交由Spring控制,从而降低耦合度。
AOP思想的支持;
声明式事务的支持;
传统的编程式事务处理繁琐、事务管理代码冗杂,spring通过声明式配置多种事务的管理,提高效率
方便程序的测试
方便集成其他优秀框架
Spring 结构 (ver 4.x)
Core Container : 核心容器
控制反转 (Inversion of Control)
依赖注入 (Dependency Injection)
Aspect Oriental Program ( ...
计算复杂性理论
Calculabilité et Complexité (计算复杂性理论)
概述
本文章是根据法国国立高等电力技术、电子学、计算机、水力学与电信学校 (E.N.S.E.E.I.H.T.) 第八学期课程 “Calculabilité et Complexité” 总结而来的课程笔记。碍于本人学识有限,部分叙述难免存在纰漏,请读者注意甄别。
参考:
《计算复杂性理论》- 陈健二教授(广州大学)
我们在研究一个问题的复杂度之前,首先需要研究这个问题能否使用计算机解决(可计算性)。
什么是问题?
函数问题:给定一个字符串 Σ∗\Sigma_*Σ∗ 作为输入,经过 fff 后输出另一个字符串 Σ∗\Sigma_*Σ∗
f:Σ∗→Σ∗f: \Sigma_* \to \Sigma_*
f:Σ∗→Σ∗
决策问题:给定一个字符串 Σ∗\Sigma_*Σ∗ 作为输入,输出为 {yes=1,no=0}\{_{yes} = 1,\quad _{no} = 0\}{yes=1,no=0}
f:Σ∗→{yes=1,no=0}f: \Sigma_* \to \{_{yes} = 1 ...