多租户改造、租户隔离

多租户适配需要从产品底层进行尽量少的改造,能够满足上云之后多租户的数据、缓存、定时任务等隔离 条目名称 适配方案 持久层适配 支持schema和字段隔离两种方案 quartz定时任务 上下文无法获取租户信息,通过JobGroup识别 reids缓存 缓存key体现租户id即可 websocket场景 从cookie获取、前端调用diw...

阅读全文

SpringBoot自动配置

前言通常来说,我们接触过的SpringBoot程序,只需要运行主启动类的main方法就可以启动应用了。 123456@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringAp...

阅读全文

SpringBoot自定义starter

介绍SpringBoot在配置上相比Spring要简单许多, 其核心在于spring-boot-starter。在使用SpringBoot来搭建一个项目时, 只需要引入官方提供的starter, 就可以直接使用, 免去了各种配置。starter简单来讲就是引入了一些相关依赖和一些初始化的配置。 SpringBoot官方提供了很多starter,第三方也可以定...

阅读全文

SPI

Java的SPISPI全称为Service Provider Interface,是jdk内置的一种服务提供发现机制。简单来说,它就是一种动态替换发现的机制。 SPI规定,所有要预先声明的类都应该放在META-INF/services中。配置的文件名是接口/抽象类的全限定名,文件内容是抽象类的子类或接口的实现类的全限定类名,如果有多个,借助换行符,...

阅读全文

Spring循环依赖

前置知识 Spring的依赖注入方式,我们分为setter注入和构造器注入。那么Spring可以解决掉setter类型的依赖注入,构造器形式的是不可以的。 Spring的单例和多例模式,多例模式下的依赖注入也是解决不掉的。所以我们关注的范围为单例模式下setter注入形式的循环依赖的解决方案。 SpringBean的生命周期我们可以概括为实例化、属性赋值、初...

阅读全文

SpringBoot如何启动IOC容器

main方法进入12345678@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, a...

阅读全文

JVM垃圾回收

如何判断对象是否存活垃圾收集器在对堆进行回收前,首先就是需要确定哪些对象还”存活”,哪些已经”死去”(即不可能再被任何途径使用的对象),大致上来说有两种算法: 1)引用计数算法 这也是很多教科书中判断对象是否存活的算法: 给对象添加一个引用计数器,当该对象被引用时,计数器加1;当引用失效时,计数器减1,任何时刻计数器为0的对象就是不可能再被使用的。该算法实现...

阅读全文

JVM运行时区域

JVM运行时内存区域我们以HotSpot虚拟机为前提下展开,因为目前使用最多的还是HotSpot虚拟机。 Java虚拟机在执行Java程序时,会将分配给JVM的内存划分为几个不同的区域。有些区域在JVM启动之后就存在,直到关闭JVM进程;有些区域则依赖于用户线程,随着用户线程的生命周期一同创建和销毁。 从Java1.8开始,JVM内存区域划分如图所示,从图中...

阅读全文

线程池的基本原理

什么是线程池线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务。 使用线程池的好处: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时...

阅读全文

ThreadLocal

ThreadLocal概念ThreadLocal,即线程变量,是以一个ThreadLocal对象为key、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。 ThreadLocal使用场景场景1,ThreadLocal 用作保存每个线程独享的对象,为每个线程都创建一个副本,这...

阅读全文