八股文学习二(spring boot + mybatis)

news2024/11/26 15:38:31

三. 架构

1. spring boot

Spring Boot是一个依靠大量注解实现自动化配置的全新框架。约定优于配置;独立运行的 Spring 项目,内嵌servlet容器;Spring Boot 框架内部已经实现了与Spring以及其他常用第三方库的整合连接,并提供了默认最优化的整合配置,使用时基本上不需要额外生成配置代码和XML配置文件。在需要自定义配置的情况下,Spring Boot更加提倡使用Java config(Java 配置类)替换传统的XML配置方式,这样更加方便查看和管理。

(1) ioc & aop

 IOC: 使用Spring框架之后对象的实例不再由调用者来创建,而是直接由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是调用者的程序代码直接控制。控制权由应用程序转移到Spring容器,控制权发生了反转。

AOP: 为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性

实现AOP的主要设计模式就是动态代理。
Spring的动态代理有两种:一是JDK的动态代理(只能代理接口);

另一个是cglib动态代理(可以代理类和接口)。

  • JDK动态代理主要涉及java.lang.reflect包下的两个类:Proxy类和InvocationHandler接口。

JDK代理实现的三个要点:

① 通过Java.lang.reflect.Proxy类来动态生成代理类;

② 代理类要实现InvocationHandler接口;

③ JDK代理只能基于接口进行动态代理的;

  • CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法去技术拦截所有的父类方法的调用,并顺势织入横切逻辑。

CGLib和JDK的原理类似,也是通过方法去反射调用目标对象的方法。

 关于Spring的两三事:傻傻分不清楚的filter和interceptor - 知乎

Spring系列之Filter and Interceptor - 简书

spring事务实现原理

Spring实现原理

2.mybatis

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

下图是MyBatis架构图:

(1)mybatis-config.xml是Mybatis的核心配置文件,通过其中的配置可以生成SqlSessionFactory,也就是SqlSession工厂

(2)基于SqlSessionFactory可以生成SqlSession对象

(3)SqlSession是一个既可以发送SQL去执行,并返回结果,类似于JDBC中的Connection对象,也是Mybatis中至关重要的一个对象。

(4)Executor是SqlSession底层的对象,用于执行SQL语句

(5)MapperStatement对象也是SqlSession底层的对象,用于接收输入映射(SQL语句中的参数),以及做输出映射(即将SQL查询的结果映射成相应的结果)

Mybatis(真的超级超级详细) - 知乎

3.dubbo

(1) dubbo架构

为了学习如何使用Dubbo,首先我们要了解dubbo的架构是怎么样的,如上图所示,dubbo 的核心架构中,分了4个角色:注册中心、服务提供者、服务消费者、监控中心。它们的功能分别是:

  • Registry:注册中心,负责服务地址的注册和查找,服务的Provider和Consumer只在启动时与注册中心交互,注册中心通过长连接感知Provider的存在,在Provider出现宕机的时候,注册中心会立即推送相关事件通知consumer。
  • Provider:服务提供者。在它启动的时候,会向Registry进行注册操作,将自己的地址和相关配置信息封装成Url添加到Zookeeper中。
  • Consumer:服务消费者。在它启动时,会向Registry进行订阅操作。Comsumer和Provider建立的是长连接,且Comsumer会缓存Provider信息,所以一旦建立,即使注册中心宕机,也不会影响已运行的Provider和Consumer。
  • Monitor:监控中心。用于统计服务的调用次数和调用时间,监控中心宕机不会影响Provider和Consumer,只是丢失监控数据。

Dubbo基本原理和用法讲解 - 知乎

4.zookeeper

ZooKeeper 基础知识基本分为三大模块:数据模型、ACL 权限控制、Watch 监控。

数据模型是最重要的,很多 ZooKeeper 中典型的应用场景都是利用这些基础模块实现的。比如我们可以利用数据模型中的临时节点和 Watch 监控机制来实现一个发布订阅的功能。

(1)数据模型

  数据模型就是 ZooKeeper 用来存储和处理数据的一种逻辑结构。ZooKeeper 数据模型最根本的功能就像一个数据库。

  ZooKeeper 中的数据模型是一种树形结构,非常像电脑中的文件系统,有一个根文件夹,下面还有很多子文件夹。ZooKeeper 的数据模型也具有一个固定的根节点(/),我们可以在根节点下创建子节点,并在子节点下继续创建下一级节点。ZooKeeper 树中的每一层级用斜杠(/)分隔开,且只能用绝对路径(如“get /work/task1”)的方式查询 ZooKeeper 节点,而不能使用相对路径。

 (2)ACL权限控制

如何使用 ZooKeeper 的 ACL 机制来实现客户端对数据节点的访问控制?

  一个 ACL 权限设置通常可以分为 3 部分,分别是:权限模式(Scheme)、授权对象(ID)、权限信息(Permission)。最终组成一条例如“scheme:id:permission”格式的 ACL 请求信息。

客户端在 ACL 权限请求发送过程的步骤比较简单:首先是封装该请求的类型,之后将权限信息封装到 request 中并发送给服务端。而服务器的实现比较复杂,首先分析请求类型是否是权限相关操作,之后根据不同的权限模式(scheme)调用不同的实现类验证权限最后存储权限信息。

(3)Watch监控

ZooKeeper 的客户端也可以通过 Watch 机制来订阅当服务器上某一节点的数据或状态发生变化时收到相应的通知,我们可以通过向 ZooKeeper 客户端的构造方法中传递 Watcher 参数的方式实现:

new ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
客户端 Watch 注册实现过程

  我们先看一下客户端的实现过程,在发送一个 Watch 监控事件的会话请求时,ZooKeeper 客户端主要做了两个工作:标记该会话是一个带有 Watch 事件的请求、将 Watch 事件存储到 ZKWatchManager。

服务端 Watch 注册实现过程

Zookeeper 服务端处理 Watch 事件基本有 2 个过程:解析收到的请求是否带有 Watch 注册事件、将对应的 Watch 事件存储到 WatchManager。

  ZooKeeper 实现的方式是通过客服端和服务端分别创建有观察者的信息列表。客户端调用 getData、exist 等接口时,首先将对应的 Watch 事件放到本地的 ZKWatchManager 中进行管理。服务端在接收到客户端的请求后根据请求类型判断是否含有 Watch 事件,并将对应事件放到 WatchManager 中进行管理。

  在事件触发的时候服务端通过节点的路径信息查询相应的 Watch 事件通知给客户端,客户端在接收到通知后,首先查询本地的 ZKWatchManager 获得对应的 Watch 信息处理回调操作。这种设计不但实现了一个分布式环境下的观察者模式,而且通过将客户端和服务端各自处理 Watch 事件所需要的额外信息分别保存在两端,减少彼此通信的内容。大大提升了服务的处理性能。

ZooKeeper - 知乎

Zookeeper的分布式锁实现

Zookeeper的应用场景

5.gradle

6.git

git基本操作,一篇文章就够了! - 掘金

git rebase,看这一篇就够了 - 掘金

四. 设计模式

图文详解 23 种设计模式

设计模式23模式介绍_哪 吒的博客-CSDN博客

Spring篇-Spring中使用了哪些设计模式 - 知乎

五. 集合类学习

六.其他

(1)Spring支持五个作用域:singleton、prototype、request、session、global session

1.singleton:默认作用域Spring IOC容器仅存在一个Bean实例,Bean以单例方式存在,在创建容器时就同时自动创建了一个Bean对象。作用域范围是ApplicationContext中。

2.prototype:每次从容器中调用Bean时,都会返回一个新的实例,即每次调用getBean时。作用域返回是getBean方法调用直至方法结束。

相当于执行newXxxBean().Prototype是原型类型,再我们创建容器的时候并没有实例化,而是当我们获取Bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。

3.request:每次HTTP请求都会创建一个新的Bean,作用域范围是每次发起http请求直至拿到相应结果。该作用域仅适用于WebApplicationContext环境。

4.session:首次http请求创建一个实例,作用域是浏览器首次访问直至浏览器关闭。

同一个HTTP Session共享一个Bean,不同Session使用不通的Bean,仅适用于WebApplicationContext环境。

5.global-session:作用域范围是WebApplicationContext中, 作用于集群环境的会话范围。一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境。

作用域范围比较:

prototype < request < session < global-session < singleton

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2011-2015年西双版纳热带季节雨林碳水通量观测数据集

摘要 中国“双碳”目标的提出立足于应对气候变化的科学基础之上,增加碳汇、减少碳源成为实施气候治理的必需。陆地生态系统是重要的大气碳汇,而热带季节雨林生态系统作为中国陆地生态系统的组成部分,具有生物量丰富、生产力旺盛等特征,发挥着不可或缺的固碳功能。自2002年建…

选择(使用)数据库

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: use 数据库名称;大家应该知道,在对数据库进行操作的时候,要制定数据库的操作对象,也就是说操作哪一个数据库 案列:选择testing数据库 …

Cesium 加载gltf

imageBasedLightingFactor&#xff1a;指定基于漫射和高光图像的照明因子参数 let position Cesium.Cartesian3.fromDegrees(104.17401, 30.65793, 10);const heading Cesium.Math.toRadians(135);const pitch 0;const roll 0;const hpr new Cesium.HeadingPitchRoll(head…

Java实现合并多个excel操作

涉及较多封装的工具类&#xff0c;所有依赖的工具类均提供代码&#xff0c;根据名称新建对应的类&#xff0c;在每个工具类中再引入相应的依赖即可 首先需要明确的是&#xff0c;需要合并的每个excel的表头名称必须是相同的&#xff0c; 针对表头&#xff0c;建立传输的dto&a…

数据结构:树的概念和结构

文章目录 1. 树的概念2. 树的结构3. 树的相关概念4. 树的表示孩子表示法双亲表示法孩子兄弟表示法 5. 树在实际中的应用5. 树在实际中的应用 1. 树的概念 树是一种非线性的数据结构,它是由 n (n > 0)个有限结点组成一个具有层次关系的. 把它叫做树是因为它看起来像一棵倒挂的…

vue基础知识八:为什么data属性是一个函数而不是一个对象?

一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象&#xff0c;也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"foo"},// 函数格式data(){return {foo:"foo"}} })组件中定义data属性&#xff…

学习day59

昨天学了插槽&#xff0c;但是没有即笔记了 今天的是vuex 总体来说&#xff0c;vuex就是一个共享单车&#xff0c;每个人都可以使用他&#xff0c;也可也对他进行反馈。即把一个数据列为vuex&#xff0c;然后每个组件可以使用这个对象&#xff0c;也可也反过来反馈他 这一个设…

VScode在服务器上远程调试python代码的工作目录问题

背景&#xff1a; 当前很多写代码都习惯使用相对路径&#xff0c;即以当前的py文件为工作目录去寻找其他的py文件。所以如果工作目录不是以当前的py文件为起始的话&#xff0c;这将导致去跑一些开源代码的时候运行不起来。 现在我遇到的问题就是&#xff0c;在远程服务器上&…

【MFC】tab控件 仿任务管理器 枚举窗口和进程

界面和关联变量设置 创建一个基于对话框的MFC项目&#xff0c;给主对话框添加一个tab控件&#xff08;设置关联变量 类型&#xff1a;CTabCtrl 名称&#xff1a;m_tab&#xff09;&#xff0c;添加两个子对话框&#xff08;IDC_PAGE1和IDC_PAGE2&#xff09;&#xff0c;给子对…

对IMU的认识

参数标定&#xff1a; 良率检测 内参标定过程 1.线性误差模型 零偏&#xff1a;静止时的误差 尺度偏差&#xff1a;每个轴上电压到实际值之间的比例差值 1->1.5 或者 1->1.3(直线的斜率) 轴偏差&#xff1a; 如下图 2.标定过程&#xff1a; 2.1角加速度标定 重…

84 # koa 实现文件上传功能

下面使用实现文件上传功能&#xff0c;先新建文件夹&#xff0c;结构如下&#xff1a; index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-…

EtsyAI评论分析工具:让你的店铺运营更省心!

Etsy 是一个在线市场平台&#xff0c;成立于 2005 年&#xff0c;总部位于美国纽约。Etsy 的主要特点是它专注于手工艺品、独立设计、艺术品、古董物品和特色商品的销售。 Etsy是一个知名的电商平台&#xff0c;它专注于手工艺品、创意设计和独特商品的售卖&#xff0c;相信大家…

【自动化测试】如何提高自动化脚本的健壮性和稳定性?

自动化脚本可能出错的原因&#xff1f; 配置环境引起 自动化测试脚本的配置。对测试程序进行配置。如&#xff1a;是否还原初始设置、是否删除某些数据。对浏览器进行配置。对与测试程序有关的程序或影响脚本稳定性的程序进行配置。 非配置环境引起 网络延时&#xff0c;识…

python 爬虫的开发环境配置

1、新建一个python项目 2、在控制台中分别安装下面三个包 pip install requests pip install beautifulsoup4 pip install selenium/ 如果安装时报以下错误&#xff1a; raise ReadTimeoutError(self._pool, None, "Read timed out.") pip._vendor.urllib3.exceptio…

SegGPT: Segmenting Everything In Context论文笔记

论文https://arxiv.org/pdf/2304.03284.pdfCodehttps://github.com/baaivision/Painter 文章目录 1. 背景2. Motivation3. Method3.1 In-Context Coloring3.2 Context Ensemble3.3 In-Context Tuning 1. 背景 在Painter中&#xff0c;将各种密集预测任务视为一种着色问题。 在…

实用前端调试技巧

调试是项目开发中非常重要的环节。掌握一些调试技巧&#xff0c;不仅能帮助我们定位到问题&#xff0c;还能提升我们的开发效率。本文从两个场景来介绍调试技巧&#xff1a; 代码报错。 逻辑出错。 调试代码报错的技巧 技巧1: 读懂报错信息 大部分情况下&#xff0c;能读懂…

day5_C++

day5_C 继承 代码思维导图 继承 代码 #include <iostream>#define PI 3.14using namespace std;class Shape {protected:double perimeter;double area;public:Shape() {cout<<"Shape::无参构造"<<endl;}Shape(double perimeter,double area):per…

21 搜索二维矩阵 II

搜索二维矩阵 II 题解1 对角线上下循环搜索&#xff08;超时&#xff09; 生气&#xff01;&#xff01;无脑循环都不超时题解2 无脑循环题解3 学习STL(二分查找) 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行…

通过Power Platform自定义D365 CE 业务需求 - 3. 使用Microsoft Power应用程序

Microsoft Power Apps是一个用于开发应用程序的无代码、无代码平台。Power应用程序可以在Dataverse之上配置为数据库。尽管您可以连接Salesforce、OneDrive、Dropbox等多种云源,但Dataverse也可以用作内部数据库来构建应用程序,并通过连接器连接其他数据源进行集成。 Power应…

Redis 初识与入门

1. 什么是Redis Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 String(字符串)、…