SpringBoot3整合Mybatis plus 我们在main方法有个注解,配置我们的mapper类路径后,Spring Boot 会帮我们生成bean放到IOC容器中,这样我们就不用每个mapper类写一个@Mapper注解了。启动成功后,调用我们的接口,就能够获取数据了。我们使用postman调用截图如下:当我们在。
算法小本:前缀和数组 基本思路首先,我们会有一个原始数组,例如 int[] arr = {1, 4, 5, 9, 7, 2}。然后会要求我们求解某一段数组的累加和是多少,比如让我们求索引 1 ~ 3 的累加和,即求解answer = arr[1] + arr[2] + arr[3]。一般情况下,我们的思路为遍历数组需要的索引位置,累加得到结果。但是,如果我们如果需要频繁去得到某一段数组的累加和,那么每次计算的时间复杂度就是 O(n)。现在,我们就用累加和的思路去解决这个问题,使得时间复杂度变为 O(1)。第1步,根据
springboot实现多租户动态路由代码 01 背景当我们在做项目时,特别是ToB的项目,会发生一种场景,即大的业务流程是一样的,但是在某个节点,不同的租户有不同的业务需求。这就需要我们针对不同的租户将代码路由到不同的实现上面,从而执行正确的业务逻辑。如下图所示,我们现在有个业务逻辑,需要依次执行A、B、C、D四段代码逻辑。但是B和D节点,不同的租户有不同的业务逻辑,需要单独去实现,这时就需要我们能通过租户标识动态的路由到自己的实现上面。02 思路我们上节图中的B节点为例。首先,我们得创建一个X租户和所有租户的父类,比如我们这里就叫
Mybatis 通过拦截器动态修改SQL 01 使用场景当我们在多租户的项目中,编写SQL语句都要带上tenant字段,用于区分不同的租户只能操作自己的数据。比如,像下面的SQLselect * from member where id = #{id} and tenant = #{tenant}但是,我们的tenant属性一般是放在一个ThreadLocal的变量中的,便于我们随时获取该属性进行一些业务处理。public class TenantContext { private static final ThreadLoca
SpringBoot 使用 beforeBodyWrite 实现统一的接口返回类型 通常我们在 Spring Boot 的项目中,会使用一个类来作为统一的接口返回,比如这样:import lombok.Data;@Datapublic class Result<T> { private int code; private String message; private T data; public static <T> Result<T> success(T t) { Result<T>
排查 JVM 总是 full GC 的问题 有时候,full GC 过多,会占用大量的 CPU 资源,导致 JVM 发生过多的 STW 问题我们开始写触发该场景的业务代码import java.util.concurrent.TimeUnit;/** * @author 594781919@qq.com * @date 2020/6/8 **/public class GcTest { public static void main(String[] args) throws InterruptedException {
排查 CPU 100% 的 Java 程序 这种问题,一般开发人员还是很难遇到,或者说是遇到了也会交给很厉害的人去处理,所以这里我们就自己模拟场景,然后去排查解决。当然实际生产情况查询原因更难,有很多复杂的情况。话不多说,首先是编写触发的代码public class CpuTest { public static void main(String[] args) { while (true) { /* */ } }}然后我们执行代码在这里我是在 centos 系统执行
springboot整合redisson 01 搭建redis服务我是在自己的云服务通过docker搭建了一个单机的redis服务docker run -d --rm --name redis5 -p 6379:6379 redis --requirepass "123456"02 创建应用1.在pom.xml文件导入redisson依赖<dependency> <groupId>org.red...
JDK8源码阅读:wait方法和sleep方法的区别 wait和sleep的区别,这真是在面试中一个高高高高频的面试题。哈哈,要想说完这两个家伙的所有区别还是不太容易的,今天我们就来总结下这两个方法的区别。把小本本拿出来,一条条记下来。我们先来看看源码,是不是一听要看源码就脑阔疼,放心,这两个方法源码还是容易理解的。因为它们两个是native方法????。 /** * Causes the current thread to w...
设计模式之路:策略模式 01 说明定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。02 UML图03 代码实现public abstract class AbstractOperation { public abstract int calculate(int m, int n);}public class AddOperation extends AbstractOperat...
数据结构之路:稀疏数组 假如,我们有一个二维数组array,里面大部分的数据都是0,只有两个数字不一样,分别是array[1][2] = 1 和 array[2][3] = 2。[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0][0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0][0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0, 0...
设计模式之路:简单工厂模式 01 简介简单工厂模式,就是我们把需要new出来的对象放到工厂方法中进行创建。我们有一个抽象类叫Animal,每个动物都需要吃东西才能活着,所以我们在Animal类中定义一个抽象方法叫eat()。现在,我们有三种动物,分别是dog、cat和rabbit,然后我们都去继承Animal类,并实现eat()这个方法。最后,我们有一个工厂类,有一个静态方法get(String name),通过这个...
Spring Cloud Alibaba实战(2) - nacos服务的一些细节 在上篇文章Spring Cloud Alibaba实战(1) - 快速上手nacos注册中心,我们留了一些问题还没解决,现在我们来一个一个解决掉吧。01 访问nacos页面1.1 端口号我们打开nacos/conf/application.properties文件可以发现设置了端口号为8848,还有应用的context path 为/nacos1.2 登录的账号密码我们在访问nacos...
Spring Cloud Alibaba实战(1) - 快速上手nacos注册中心 Spring Cloud版本是Greenwich.RELEASESpringboot版本是2.1.9.RELEASESpring Cloud Alibaba版本是2.1.0.RELEASE01 环境准备需要在启动的机子上安装了jdk802 下载nacos的压缩包下载地址:https://github.com/alibaba/nacos/releases03 运行nacos服务...
springboot整合apollo配置中心 1 下载apollo源码源码地址2 使用docker-compose启动apollo进入到启动docker compose 的文件路径,我这里是在centos系统启动的apollo。我已经提前安装好docker和docker-compose。输入执行命令[root@jamie docker-quick-start]# docker-compose up启动成功后,我们就可以在浏览器...
springboot同一个类里的方法之间调用事务不起作用 今天在看项目代码的时候,发现在service层,有方法调用同类中的方法,SonarLint提示有bug。下图是我自己做测试时写的demo代码:经过测试发现,当A方法调用同类中带有@Transactional注解的B方法时,被@Transactional注解的B方法的事务是不起作用的。原因:spring会扫描@Transactional的类和方法,并通过动态代理实现启动事务的代理方法。这...
springboot实现一个starter 1 pom文件引入依赖先新建一个maven工程。然后,在pom文件引入需要的依赖:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo...