TreeMind树图在线AI思维导图

学习思维导图

  收藏
  分享
免费下载
免费使用文件
U544286137 浏览量:892023-09-04 13:40:06
已被使用13次
查看详情学习思维导图

树图思维导图提供 学习 在线思维导图免费制作,点击“编辑”按钮,可对 学习  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:e13f909527cad7ce9c959122c5bf36a0

思维导图大纲

学习思维导图模板大纲

代码块

静态块的主要作用是为static属性进行初始化, 无论产生多少实例化对象,静态块都只执行一次。

静态代码块继承关系,都是会先去执行继承的父类的静态代码块,再执行子类的静态代码块

非静态代码块,每次都会随类加载而执行,同理构造方法也一样

执行顺序,父类静态代码块>子类静态代码块>父类非静态代码块>子类非静态代码>父类构造方法>子类构造方法

XmlBeanDefinitionReader 加载xml类

Spring 通过提供ORM模块,支持我们在直接JDBC之上使用一个对象/关系映射映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS SQL Maps。Spring的事务管理同样支持以上所有ORM框架及JDBC。

MessageSource实现国际化

类加载机制

排序算法

https://blog.csdn.net/weixin_41835916/article/details/81661314?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

冒泡排序:就是把1和2比较,如果1大于2,就互相替换,,第二次循环就是那2和3比较,如果大就替换,反正最后肯定会是最大的在一边,

选择排序:就是在数组里面找到最小值或者最大值放在一边,然后循环这个操作,依次放到前一个最小或者最大的后面

多数据源切换

集成AbstractRoutingDataSource

抽象路由数据源

重写determineCurrentLookupKey()

确定当前看的key

ThreadLocal来写一个工具类,ThreadLocal用来存放线程的变量,每个线程都存成一个副本

事务管理

事务四大特性 ACID

原子性 atomicity [欧凸米系踢 ætəˈmɪsəti]

表示事务执行过程中,任何一部分的失败,都会导致事务所做的所有修改失效

一致性 consistency [啃sis踢C kənˈsɪstənsi]

表示当事务执行失败的时候,所有被该事务执行所影响到的数据都应该恢复到事务执行之前

隔离性 isolation [爱C类讯ˌaɪsəˈleɪʃn]

表示事务在执行过程中对数据的修改,在提交之前对其他事务不可见

持久性 durability [的啊biu li ti, dərəˈbɪlɪti]

表示已经提交的数据,事务处理结束,其效果在数据库中持久化

总结:事务是一组原子性操作,从数据库角度来说就是一组sql指令,任何一个指令的失败,则撤销全部指令,(要么全部成功,要么全部失败)

三种事务

JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。

放大 setautoCommit(false) commit 手动提交

JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂

容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。

事务并发处理问题

脏读(dirty read)

一个事务读取了另一个事务尚未提交的数据

不可重复读(non-repeatable read)

一个事务的操作导致另一个事务前后读取的到不同的数据

幻读(phantom read)

一个事务操作,导致另一个事务读取的数据前后查询数据量不同

数据库事务的四大隔离级别

TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读。

TRANSACTION_READ_COMMITTED 禁止脏读,但允许不可重复读和幻读。 大部分数据库采用的级别

TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读,单运行幻读。 mysql默认的级别

TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读。 事务操作排序允许,但是性能很差

SrpingAOP事务配置

spring事务的传播机制

所谓传播机制,就是事务在多个方法调用中是如何传播的,是创建新的事务,还是使用父类方法的事务?父类方法事务的回滚,是否对子类方法的事务存在影响

Propagation.REQUIRED 传播.必须

假如如果没有事务就会去创建事务,如果有时候就不再去创建新的事务,使用调用方的事务

Propagation.NOT_SUPPORTED 传播.不支持

就是没有事务

Propagation.REQUIRES_NEW 传播.新

为当前方法创建新的事务,不管是否有事务的存在与否,并且在新事务提交后,才提交调用方的老事务

Propagation.MANDATORY 传播.强制性

必须在一个已存在的事务下执行,比如A调用B方法,B开启了MANDATORY 强制性事务,那么必须A有事务,不然就会报错

Propagation.NEVER 传播.绝不

必须在没有存在的事务下,比如A调用B方法,B开启了NEVER 绝不事务,那么必须A没有事务,不然就会报错

Propagation.SUPPORTS 传播.支架

使用调用方的事务,举例 假如A调用B 如果A有事务,就使用A的事务,假如A没有事务,那大家都没事务

Propagation.NESTED 传播.嵌套

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与REQUIRED类似的操作,去创建一个新的事务

springAoP

Aop的思想是基于代理的思想对原来的目标,创建代理对象,在不修改原对象的的情况下,调用增强功能的代码,从而对原有业务进行增强

两种代理方式

JDK动态代理

详细代码

CgLib动态代理

在实际开发中,可能需要对没有实现接口的类增强,用JDK动态代理的方式就没法实现。采用Cglib动态代理可以对没有实现接口的类产生代理,实际上是生成了目标类的子类来增强。

详细代码

静态代理 AspectJ

是指在编译层面将代理类编织进执行类中

线程池 concurrent.Executor

为什么需要线程池,是为了节约创建和销毁线程所消耗的内存性能

1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;

2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

四大线程池

①newSingleThreadExecutor 单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务

②newFixedThreadExecutor(n) 固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行

③newCacheThreadExecutor(推荐使用) 可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。

④newScheduleThreadExecutor 支持定时和周期性的执行线程

Java socket的介绍

通过Socket实现TCP编程

客户端的Socket类

服务器端的ServerSocket类

通讯过程设计四个层

应用层 http、ssh、telnet ,SSH

HTTP 超文本传送协议(Hypertext Transfer Protocol )是应用层协议,定义的是传输数据的内容的规范。

传输层 TCP,UDP,PRT.STP

Socket连接所在层,TCP,三次握手机制

为了防止失效的的请求突然传输给服务端,而导致服务端白白等待,浪费资源

三次握手建立了连接,可以在应用层开始数据传输了

网络层 IP ,ICMP

物理层 光缆,无线网络

总结:

网络是路,TCP是跑在路上的车,HTTP是车上的人。每个网站内容不一样,就像车上的每个人有不同的故事一样

容器

ApplicationContext继承了ListableBeanFactory、HierarchicalBeanFactory,另外还通过其它几个接口扩展了BeanFactory的功能。(总结Application扩展了BeanFactory)

BeanFactory 是一个工程模式,是根据需要去创建实例化Bean

ApplicationContext 是一次性加载所有bean 参数来源于ServletContext上下文,所有我们可以从里面获取任何加载实物,并且在有监听器去启动加载ContextLoaderListener 因为他实现了接口ServletContextListener的方法 初始化的时候启动装配ApplicationContetx

<context-param></context-param>转化为键值对,并交给ServletContext,包括大量配置文件,后面要交给容器去创建对象

WebApplicationContext,是继承于ApplicationContext的一个接口,扩展了ApplicationContext,便会执行类ContextLoaderListener的相关方法,创建WebApplicationContext(Web应用上下文Servlte)并以键值对形式存放与ServletContext中

Web容器启动时将调用HttpServletBean的init方法

FrameworkServlet通过initServletBean()进行Web上下文初始化 调用 initServletBean()初始化 this.webApplicationContext = initWebApplicationContext(); 比如异常处理,视图处理,请求映射等功能

将初始化的上下文放入servletContext中

WebApplicationInitializer-onStartup方法, 可以替代web.xml,在容器装载前执行,set进 serveltContext上下文 保证两个key值 contextInitializerClasses 和contextClass

然后通过监听器去初始化(initWebApplicationContext)注入上下文中的bean 到容器来管理

获取Bean对象

不用类似new ClassPathXmlApplicationContext()的方式,从已有的spring上下文取得已实例化的bean。通过ApplicationContextAware接口进行实现。 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。

分布式锁的几种方式

redis锁

使用setnx进行set 如果返回为1即获得了改锁,解锁就使用del命名进行解锁,当然也要设置一个超时时间,否则会长时间被锁 同理,考虑到极端情况

Memcached

利用 Memcached 的 add 命令。此命令是原子性操作,只有在 key 不存在的情况下,才能 add 成功,也就意味着线程得到了锁

Zookeeper

利用 Zookeeper 的顺序临时节点,来实现分布式锁和等待队列。Zookeeper 设计的初衷,就是为了实现分布式锁服务的。

为什么要重新hashCode 和equals

这是为了方便比较数据 假如学生A和学生B 年龄,性别,体重都一样,但是地址不一样,理论上是相同的对象,那么重新equals 就是去比较年龄,性别,体重是否都一样,(基本数据类型.equeal地址和value肯定一样),但是这时间hashCode值会不一样.那我们也去重新hashCode.利于这三个值得hashCode 相乘或者相加值,作为一个hashCode. 这时候如果你往set里面 hashSet取存储,会默认删除一个,因为底层时间就是根据hashCode去重,同理HashMap 如果key也是根据hashCode来保持唯一的

排查tomcat因内存溢出挂了

1。先使用监控工具监控堆内存,栈内存区是不是使用率是不是居高不下

2。一般会出现老年代内存使用爆增.因为一般会产生很大的数据,导致新生代放不下,就放去了老年代,然后老年代空间满了,他就会疯狂CG

3。ps -ef | grep tomcat 获取PID 根据PID top -Hp pid 查询使用状态 根据异常的 id 使用命令 jstack pid> stack.log 打印出栈日志

1.-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/jvmdump 配置在jvm 中 在每次发生内存溢出时,JVM会自动将堆转储,dump文件存放在-XX:HeapDumpPath指定的路径下

2.使用jmap命令收集 通过jmap -dump:live,format=b,file=/opt/jvm/dump.hprof pid。

3。然后download到本地,解压。 运行堆分析工具JProfile,装载这个dump.hprof文件。 然后查看堆当时的所有类占比大小的信息

或者还有一种方式,监控到内存异常,就直接去检查这个版本的代码,看是否哪里因为笛卡尔积,迭代出来的超大对象

集合 https://www.jianshu.com/p/939b8a672070

数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;

Map接口

HashMap

TreeMap

HashTable

ConcurrentHashMap

Properties

Collection接口

Set

HashSet

TreeSet

LinkedHashSet

List

ArrayList

LinkedList

Stack

Vector

Vector类 是在 java 中可以实现自动增长的对象数组

HashMap和HashTable 不同之处

1.HashMap是线程不安全的,HashTable是线程安全的,因为使用了synchronized关键字,所以速度不怎么好

2.HashMap 允许key/val为空,HashTable不可以

HashMap 在JDK1.8前是 数组+链表 a%b=a - (a/b)*b

即默认初始化16大小的entity数组.存储方式是根据key的[hashCode%数组的长度]确定存储node点,当然这样肯定会出现相同的hashCode,这时候在数组某单列上面,在使用了链表结构 所以一个Entity 应该包含hash,key,value,next 这四个参数 next同hashCode的值得指向

HashMap 在JDK1.8后是 数组+链表+红黑数

在原来的基础上,如果数组某节点挂载的entity数超过了8个就会转化成红黑色结构

ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而 ArrayList和HashMap并不是线程安全的。因为同步需要花费机器时间,所以Vector和HashTable的执行效率要低于 ArrayList和HashMap。

如果进行全部迭代的操作,那么用ArrayList会比较合适,删除是大忌,会导致全部值得重新位移,消耗内存时间 如果你的List还要经常增删,那么用LinkedList比较合适。 如果你要快速查找,取值,用HashMap比较合适。 如果同时要保证,元素放进去的顺序和取出来的顺序一致用LinkedHashMap。

>>> ,>> 是指位移运算 是指二进制 0000 1111 >> 0000 0011

^ 是指如果相同则为0,不相同则为1 1000^ 1011=3

&和| &要两者都为1 才为1 | 是指任何为1 即为1

springmvc

DispatcherServlet

WebApplicationContext,是继承于ApplicationContext的一个接口,扩展了ApplicationContext,便会执行类ContextLoaderListener的相关方法,创建WebApplicationContext(Web应用上下文Servlte)并以键值对形式存放与ServletContext中

Web容器启动时将调用HttpServletBean的init方法

FrameworkServlet通过initServletBean()进行Web上下文初始化 调用 initServletBean()初始化 this.webApplicationContext = initWebApplicationContext(); 比如异常处理,视图处理,请求映射等功能

将初始化的上下文放入servletContext中

DispatcherServlet对http请求的处理过程

所有的请求都会调用Service方法

FramWorkServlet子类继承了HttpServlet 重写了doPost 调用了processRequest(req,res)

然后会去执行一个doService方法,保存request的快照,添加request的请求数据.然后继续调用doDispatch方法继续,当然里面也会去处理include请求,

会去调用getHandler 里面会去匹配 handlerMapeer 这个里面保存了servlet请求的映射

1.向前端发送请求 请求被Spring 前端控制Servelt DispatcherServlet捕获;

2.HandlerAdapter使用过程: DispatcherServlet中的doService方法经过数据灌入后调用doDispatch方法; doDispatch会先利用HandlerMapping得到想要的HandlerExecutionChain(里面包含handler和一堆拦截器),即得到controller;

3. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

4.DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

5. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作: HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

6. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

7. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

8. ViewResolver 结合Model和View,来渲染视图

9. 将渲染结果返回给客户端。

request,response是服务创建的,将请求信息封装成request对象

重定向和转发

重定向是两次浏览器请求响应

转发是共享一个request和response的,属于同一个请求响应

HttpMessageConverters

对象和json转换器

悲观锁

每次拿数据都会去认为有其他线程修改了数据,所以每次拿数据都会上锁--一般适用于写操作

乐观锁

每次拿数据都认为没有修改,只是会去判断下数据是否被修改,--一般适用于读操作

乐观锁一般会使用版本号或CAS算法实现

单点登录两张情况

同域下

分布式结构多服务,我们之间登录之后生产一个token 存入redis,设置失效时间,然后当cookie返回,下次请求的时候 带入cookie验证redis是否未失效.没失效就登录

不同域下

设置一个单独的登录系统 也就是SSO系统

1.访问A系统未登录 跳转到SSO登录系统

2.SSO登录系统验证登录信息,通过后写入改系统的session,并且返回cookie

3.然后生产一个 token 跳转到A系统当做入参

4.A系统获取token 再去调用SSO登录系统验证这个token是否正确,正确就直接登录,并且写入本系统的cookie

5.同样,当B系统查询的时候,也会去跳转到SSO系统,这时候SSO已经是登录状态了对吧

6.那我用当前token 跳转B系统 ,B系统用次token 调用SSO系统验证是否正确,正确就登录,并且当做cookie 返回给B系统

7.解决tomcat集群 session不共享问题 SSO系统应该将生成的token存入redis中,没有验证都是去改SSO系统验证 不在自己的tomcat中验证

相关思维导图模板

一、研究内容思维导图

树图思维导图提供 一、研究内容 在线思维导图免费制作,点击“编辑”按钮,可对 一、研究内容  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:4f21797dd3e8b08f1951dfc24e7be94f

如何从大历史观学习中国历史思维导图

树图思维导图提供 如何从大历史观学习中国历史 在线思维导图免费制作,点击“编辑”按钮,可对 如何从大历史观学习中国历史  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:5a22832470b2860422e8670dd763724d