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

三. 架构

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.hqwc.cn/news/107323.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

石化行业应力应变监测系统的应用-基于PreMaint设备健康管理平台

在石化行业&#xff0c;管道安全一直是一个备受关注的话题。输气管道在高风险地区的安全运行一直备受关注&#xff0c;特别是在地质灾害频发的山地、沿线地形复杂、易受自然灾害影响的区域。为了保障管道的可靠运行并降低地质灾害带来的风险&#xff0c;石化企业引入了应力应变…

vue手写提示组件弹窗

1、弹框展示 2、message组件 新建一个message.vue <template><div class"wrapper" v-if"isShow" :class"showContent ? fadein : fadeout">{{ text }}</div> </template> <script></script> <style s…

如何把视频格式转换成mp4?支持的格式种类非常多。

如何把视频格式转换成mp4&#xff1f;随着计算机技术的迅猛发展&#xff0c;我们现在有着各种各样的视频格式可供选择&#xff0c;平时我们都知道的mp4、flv、mov、mkv、avi、wmv等&#xff0c;都是视频格式的种类。其中&#xff0c;MP4是一种具有极佳兼容性的视频格式&#xf…

Linux——Shell脚本编程(1)

一、为什么要学习 Shell 编程 &#xff1f; 1)Linux运维工程师在进行服务器集群管理时&#xff0c;需要编写Shell程序来进行服务器管理。 2)对于 JavaEE 和 Python 程序员来说&#xff0c;工作的需要&#xff0c;要求你编写一些 Shell脚本进行程序或者是服务器的维护&#xff…

vue 分页器组件+css动画效果

全网都找了一遍没有找到符合UI需求的分页动画&#xff0c;于是就主动上手了 需求&#xff1a; 1、分页最多显示9页&#xff0c;总页数最多显示无上限&#xff1b; 2、点击下一页的时候需要有动画效果过度&#xff0c;如果当前页数是当前显示最后的一页&#xff0c;则停了当前…

Spring MVC:请求转发与请求重定向

Spring MVC 请求转发请求重定向附 请求转发 转发&#xff08; forward &#xff09;&#xff0c;指服务器接收请求后&#xff0c;从一个资源跳转到另一个资源中。请求转发是一次请求&#xff0c;不会改变浏览器的请求地址。 简单示例&#xff1a; 1.通过 String 类型的返回值…

MySQL高可用九种方案

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 参考视频[2] MMM 方案&#xff08;单主&#xff09; MySQL 高可用方案之 MMM&#xff08;Multi-Master Replication Manager&#x…

【PowerQuery】Excel 一分钟以内刷新PowerQuery数据

当需要进行刷新的周期如果小于一分钟,采用数据自动刷新就无法实现自动刷新的目标。那就没有办法了吗?当然不是,这里就是使用VBA来实现自动刷新。这里实现VBA刷新的第一步就是将当前的Excel 保存为带有宏的Excel 文件,如果不带宏则无法运行带有宏代码的Excel文件,保存过程如…

Linux--进程间通讯--FIFO(open打开)

1. 什么是FIFO FIFO命名管道&#xff0c;也叫有名管道&#xff0c;来区分管道pipe。管道pipe只能用于有血缘关系的进程间通信&#xff0c;但通过FIFO可以实现不相关的进程之间交换数据。FIFO是Linux基础文件类型中的一种&#xff0c;但是FIFO文件在磁盘上没有数据块&#xff0c…

golang flag 包的使用指北

说起 golang 的 flag 个包&#xff0c;我们第一反应的是什么呢&#xff1f;至少我曾经第一次看到 flag 包的时候&#xff0c;第一反应是想起写 C 语言的时候咱们用于定义一个表示的&#xff0c;我们一般会命名为 flag 变量 实际上 golang 的 flag 包是用于处理命令行参数的工具…

59-代码随想录--数组--螺旋矩阵

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个正整数 n&#xff0c;生成一个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 模拟顺时针…

ITIL 4—创建、交付和支持—设定工作优先级和管理供应商

5. 设定工作优先级和管理供应商 5.1 为什么我们要对工作优先级排序? 只要工作需求超出了在预期时间内能完成的产能&#xff0c;就会出现排队的情况。在理想情况下&#xff0c;组织的需求没有任何变化&#xff0c;并且拥有满足需求所需的适当质量和数量的资源。但现实里&…