自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 资源 (3)
  • 收藏
  • 关注

原创 六、OpenFeign服务接口调用

a、本次OpenFeign的版本要注意,最新版和网络上你看到的配置不一样在Spring Cloud微服务架构中,大部分公司都是利用OpenFeign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务要进行比较繁杂的业务计算,那后台很有可能会出现Read Timeout这个异常,因此定制化配置超时时间就有必要了。b、超时设置,故意设置超时演示出错情况,自己使坏写bug服务提供方cloud-provider-payment8001故意写暂停62秒钟程序。

2024-04-16 23:06:53 970

原创 五、LoadBalancer负载均衡服务调用

LB负载均衡(Load Balance)是什么简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx,LVS,硬件 F5等spring-cloud-starter-loadbalancer组件是什么Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用它来替换了以前的Ribbon组件。

2024-04-15 23:01:04 1186

原创 四、Consul服务注册与发现

a、consul官网地址(Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。它具有很多优点。包括: 基于 raft 协议,比较简洁;

2024-04-12 15:49:02 1480

原创 三、微服务架构编码Base工程模块构建

如果不在子项目中声明依赖,是不会从父项目中继承下来的,只有在子项目中写了该依赖项并且没有指定具体版本,才会从父项目中继承该项,且version和scope都读取自父pom;(1)如果订单微服务和支付微服务的IP地址或者端口号发生了变化,则支付微服务将变得不可用,需要同步修改订单微服务中调用支付微服务的IP地址和端口号。(3)如果系统需要支持更高的并发,需要部署更多的订单微服务和支付微服务,硬编码订单微服务则后续的维护会变得异常复杂。建普通Maven模块cloud-provider-payment8001。

2024-04-10 15:32:02 854

原创 二、关于Cloud各种组件的停更/升级/替换

让程序员专注于业务逻辑,有第3方支撑?

2024-04-10 09:51:48 141

原创 一、从Boot和Cloud版本选型开始说起

官网看Boot版本SpringBoot3.0崛起通过上面官网发现,Boot官方强烈建议你使用Java17+升级到3.X以上版本。

2024-04-09 18:03:27 806

原创 mysql运维知识总结

二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。作用:①. 灾难时的数据恢复;②. MySQL的主从复制。log_bin_basename:当前数据库服务器的binlog日志的基础名称(前缀),具体的binlog文件名需要在该basename的基础上加上编号(编号从000001开始)。log_bin_index:binlog的索引文件,里面记录了当前服务器关联的binlog文件有哪些。

2024-04-09 17:15:55 1344 1

原创 mysql进阶知识总结

大家可能没有听说过存储引擎,但是一定听过引擎这个词,引擎就是发动机,是一个机器的核心组件。比如,对于舰载机、直升机、火箭来说,他们都有各自的引擎,是他们最为核心的组件。而我们在选择引擎的时候,需要在合适的场景,选择合适的存储引擎,就像在直升机上,我们不能选择舰载机的引擎一样。而对于存储引擎,也是一样,他是mysql数据库的核心,我们也需要在合适的场景选择合适的存储引擎。接下来就来介绍一下存储引擎。存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。

2024-03-29 18:03:08 1440

原创 mysql基础知识总结

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据库中数据的正确、有效性和完整性。分类:注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

2024-03-01 10:45:11 1057

原创 高效构建Java应用:Maven的使用总结

指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型!packaging 属性为 jar(默认值),代表普通的Java工程,打包以后是.jar结尾的文件。packaging 属性为 war,代表Java的web工程,打包以后.war结尾的文件。packaging 属性为 pom,代表不会打包,用来做继承的父工程。例如: pom.xml依赖文件:使用记事本打开set REPOSITORY_PATH=D:\repository 改成你本地仓库地址即可!

2024-01-22 10:42:44 1098

原创 Docker Compose的实战应用指南

Docker 是一个开放源代码的容器化平台,允许开发者将应用及其依赖打包进轻量级、可移植的容器中。

2024-01-18 17:37:13 1320

原创 前端CSS(层叠样式表)总结

CSS 的全称为:层叠样式表 ( Cascading Style Sheets ) 。CSS 也是一种标记语言,用于给 HTML 结构设置样式,例如:文字大小、颜色、元素宽高等等。

2023-12-04 10:22:14 705

原创 API成批分配漏洞介绍与解决方案

批量分配:在API的业务对象或数据结构中,通常存在多个属性,攻击者通过篡改属性值的方式,达到攻击目的。比如通过设置user.is_admin和user.is_manager的值提升用户权限等级;假设某API的默认接口调用参数为{"user_name":"user","is_admin":0},而恶意攻击者修改请求参数,提交值为{"user_name":"attacker","is_admin":1},通过修改参数is_admin的值来提升为管理员权限。

2023-12-01 10:34:57 5255 7

原创 前端HTML(超文本标记语言)总结

全称:(超文本标记语言)。超文本:暂且简单理解为超级的文本,和普通文本比,内容更丰富。标 记:文本要变成超文本,就需要用到各种标记符号。语 言:每一个标记的写法、读音、使用规则,组成了一个标记语言。

2023-11-25 11:13:48 1066

原创 关于OpenFeign的教程详解

❝当我们自己的后端项目中 需要 调用别的项目的接口的时候,就需要通过Http客户端来调用。在实际开发当中经常会遇到这种场景,比如微服务之间调用,除了微服务之外,可能有时候会涉及到对接一些第三方接口也需要使用到 Http客户端 来调用 第三方接口。❞所有的客户端相比较,Feign更加简单一点,在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定。

2023-09-19 17:19:48 1177 1

原创 第二章:CompletableFuture

从Java8开始引入了CompletableFuture,它是Future的功能增强版,减少阻塞和轮询,可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法。下,isDone()方法容易消耗CPU资源,对于真正的异步处理我们希望是可以通过传入回调函数,在Future结束时自动调用该回调函数,这样,我们就不用等待结果。去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,忙其他事情或者先执行完,过了一会才去获取子任务的执行结果或变更的任务状态。

2023-09-11 09:46:09 198

原创 第一章_线程基础知识

java线程是通过start的方法启动执行的,主要内容在native方法start()中,openjdk的写JNI一般是一一对应的,Thread.java对应的就是Thread.c,start0其实就是JVM_StartThread。同一时刻,大家真的都在做事情,你做你的,我做我的,但是我们都在做。Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor,更常见的是直接将它称为“锁”)来实现的。并发(concurrent):是在同一实体上的多个事件;

2023-09-03 12:50:45 1323 1

原创 Spring Boot使用LocalDateTime、LocalDate作为入参

0x0 背景项目中使用LocalDateTime系列作为dto中时间的类型,但是spring收到参数后总报错,为了全局配置时间类型转换,尝试了如下3中方法。0x1 当LocalDateTime作为RequestParam或者PathVariable时这种情况要和时间作为Json字符串时区别对待,因为前端json转后端pojo底层使用的是Json序列化Jackson工具(HttpMessgeConverter);而时间字符串作为普通请求参数传入时,转换用的是Converter,两者有区别哦。

2023-08-28 14:57:44 1785

原创 Spring Boot 中的 AOP,到底是 JDK 动态代理还是 Cglib 动态代理

即能用 JDK 做动态代理就用 JDK,不能用 JDK 做动态代理就用 Cglib,即首选 JDK 做动态代理。这两者最大的区别在于基于 JDK 的动态代理需要被代理的对象有接口,而基于 Cglib 的动态代理并不需要被代理对象有接口。having:期待配置的值,如果实际的配置和 having 的值相同,则这个配置就会生效,否则不生效。Spring 中的 AOP,有接口就用 JDK 动态代理,没有接口就用 Cglib 动态代理。如果代理对象有接口,就用 JDK 动态代理,否则就是 Cglib 动态代理。

2023-08-16 10:24:55 1746

原创 Nginx配置与使用

早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求

2023-08-01 17:23:30 670

原创 Springboot读取配置的一些方式

静态变量是类的属性,并不属于对象的属性,而 Spring是基于对象的属性进行依赖注入的,类在应用启动时静态变量就被初始化,此时 Bean还未被实例化,因此不可能通过 @Value 注入属性值。如果我们想要获取 TestService 类中的某个变量的属性值,需要使用依赖注入的方式,而不能使用 new 的方式。注解的实现原理相对简单,应用程序启动时扫描所有被该注解标注的类,获取到注解中指定自定义配置文件的路径,将指定路径下的配置文件内容加载到 Environment 中,这样可以通过。

2023-07-25 14:10:46 982

原创 线程池使用时需注意的一些问题

一般建议是不同的业务使用不同的线程池,配置线程池的时候根据当前业务的情况对当前线程池进行配置,因为不同的业务的并发以及对资源的使用情况都不同,重心优化系统性能瓶颈相关的业务。

2023-07-25 10:37:05 428

原创 JUC常用4大并发工具类详解

首先这个第一个参数也是 Int 类型的,传入的是执行线程的个数,这个数量和 CountDownLatch 不一样,这个数量是需要和线程数量吻合的,CountDownLatch 则不一样,CountDownLatch 可以大于等于,而 CyclicBarrier 只能等于,然后是第二个参数,第二个参数是 barrierAction,这个参数是当屏障开放后,执行的任务线程,如果当屏障开放后需要执行什么任务,可以写在这个线程中。通过返回结果就可以很直接的看到业务线程是在初始化线程完全跑完之后,才开始执行的。

2023-07-19 15:54:31 561

原创 关于ThreadLocal相关的总结

ThreadLocal是Java中一个非常重要的线程技术。它可以让每个线程都拥有自己的变量副本,避免了线程间的竞争和数据泄露问题。在文中,将详细介绍ThreadLocal的定义、用法及其优点。ThreadLocal是Java中一个用来实现线程封闭技术的类。它提供了一个本地线程变量,可以在多线程环境下使每个线程都拥有自己的变量副本。每个线程都可以独立地改变自己的副本,而不会影响到其他线程的副本。

2023-07-11 11:12:46 486

原创 三元表达式空指针问题

此时可以看到编译器给出的警告提示,num处会发生拆箱操作,执行程序发生空指针异常,因为三元表达式在条件为false时执行到num处进行拆箱操作,也就是Integer的intValue()方法。此时可以看到编译器给出的警告提示,num处会发生拆箱操作,执行程序发生空指针异常,因为三元表达式在条件为true时执行到num处进行拆箱操作,也就是Integer的intValue()方法。情景四:将num赋值为null,将flag赋值为true,num和10调换位置。情景五:将flag赋值为true。

2023-06-29 17:07:59 382

原创 五个维度,解析 Spring 中 @Autowired 和 @Resource 的区别

Autowired是Spring定义的注解,而@Resource遵循JSR-250的规范,定义在JDK中。@Autowired默认先与byType进行匹配,如果发现找到多个Bean,则又按照byName方式进行匹配,如果还有多个Bean,则报出异常。1)如果同时指定name和type,则从Spring上下文中找到与它们唯一匹配的Bean进行装配,如果找不到则抛出异常,具体流程如下图所示。2)如果指定name,则从上下文中查找与名称(ID)匹配的Bean进行装配,如果找不到则抛出异常,具体流程如下图所示。

2023-06-28 15:31:10 560

原创 总结5种常用加密算法

前言在平时的工作中,可能也在很多地方用到了加密、解密,比如:用户的密码不能明文存储,要存储加密后的密文用户的银行卡号、身份证号之类的敏感数据,需要加密传输还有一些重要接口,比如支付,客户端要对请求生成一个签名,服务端要对签名进行验证……那么上面提到的这些能力,都可以利用哪些加密算法来实现呢?接着往下看。常见加密算法算法整体上可以分为,以及,可逆加密又可以分为和。不可逆算法不可逆加密的算法的加密是不可逆的,密文无法被还原成原文。散列算法,就是一种不可逆算法。

2023-06-26 15:45:03 5988

原创 聊一聊布隆过滤器

计数过滤器(Counting Bloom Filter)是布隆过滤器的扩展,标准 Bloom Filter 位数组的每一位扩展为一个小的计数器(Counter),在插入元素时给对应的 k (k 为哈希函数个数)个 Counter 的值分别加 1,删除元素时给对应的 k 个 Counter 的值分别减 1。元素 x 映射到位数组的第0位,第4位,第7位,元素y映射到数组的位数组的第1位,第4位,第6位。同时,哈希函数的个数也需要考量,哈希函数的个数越大,检索的速度会越慢,误判率也越小,反之,则误判率越高。

2023-06-26 13:46:59 275

原创 第二十三章_Redis高性能设计之epoll和IO多路复用深度解析

select 其实就是把NIO中用户态要遍历的fd数组(我们的每一个socket链接,安装进ArrayList里面的那个)拷贝到了内核态,让内核态来遍历,因为用户态判断socket是否有数据还是要调用内核态的,所有拷贝到内核态后,这样遍历判断的时候就不用一直用户态和内核态频繁切换了。多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(

2023-06-25 15:27:43 405

原创 第二十二章_Redis经典五大类型源码及底层实现

2 链表在内存中一般是不连续的,遍历相对比较慢而ziplist可以很好的解决这个问题,普通数组的遍历是根据数组里存储的数据类型找到下一个元素的(例如int类型的数组访问下一个元素时每次只需要移动一个sizeof(int)就行),但是ziplist的每个节点的长度是可以不一样的,而我们面对不同长度的节点又不可能直接sizeof(entry),所以ziplist只好将一些必要的偏移量信息记录在了每一个节点里,使之能跳到上一个节点或下一个节点。取值1字节时,表示上一个entry的长度小于254字节。

2023-06-21 10:11:34 1471

原创 第三章_基于zookeeper实现分布式锁

在这种羊群效应中,zookeeper需要通知1000个客户端,这会阻塞其他的操作,最好的情况应该只唤醒新的最小节点对应的客户端。在设置事件监听时,每个客户端应该对刚好在它之前的子节点设置事件监听,例如子节点列表为/lock/lock-0000000000、/lock/lock-0000000001、/lock/lock-0000000002,序号为1的客户端监听序号为0的子节点删除消息,序号为2的监听序号为1的子节点删除消息。基本上,它就是组锁的代表,在它上面的请求释放操作都会传递给它包含的所有的锁。

2023-06-16 16:24:16 1907

原创 第二章_基于redis实现分布式锁

大家都知道,如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。值得强调的是,对于未能获得大多数锁的客户端,尽快释放(部分)获得的锁有多么重要,这样就不必等待锁定期满才能再次获得锁(但是,如果发生了网络分区,并且客户端不再能够与Redis实例进行通信,则在等待密钥到期时需要付出可用性损失)。

2023-06-15 18:04:07 895

原创 第一章_从减库存聊起

乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则重试。重量级锁:当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候(10次),还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。轻量级锁(CAS):当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。

2023-06-08 15:05:11 649

原创 第二十一章_Redis的缓存过期淘汰策略

Redis内存满了怎么办redis 一共有 4 个命令来设置键的生存时间(可以存活多久)或过期时间(什么时候被删除)上述四种命令本质上都是通过 pexpireat 命令来实现的。如果自己不小心设置错了过期时间,那么可以删除先前的过期时间。此时,如果没有移除过期时间,那么如果一个键过期了,那它什么时候会被删除呢?这个问题就会有以下三种答案了,它们分别代表三种不同的删除策略(定时删除、惰性删除、定期删除)。redis默认内存多少?在哪里查看?如何设置修改?查看Redis最大占用内存。

2023-06-07 11:39:34 563

原创 总结6种服务限流的实现方式

固定窗口算法的优点是实现简单,但是可能无法应对突发流量的情况,比如每秒允许放行100个请求,但是在0.9秒前都没有请求进来,这就造成了在0.9秒到1秒这段时间内要处理100个请求,而在1秒到1.1秒间可能会再进入100个请求,这就造成了要在0.2秒内处理200个请求,这种流量激增就可能导致后端服务出现异常。并且在每个时间段内都维护了单独的计数器,每次滑动时,都减去前一个时间块内的请求数量,并再添加一个新的时间块到末尾,当时间窗口内所有小时间块的计数器之和超过了请求阈值时,就会触发限流操作。

2023-06-06 18:15:45 817

原创 第二十章_Redis分布式锁Redlock算法和底层源码分析

首先,我们假设客户端能够在大多数实例中获取锁所有实例都将包含一个具有相同生存时间的密钥,然而,这个key是在不用时间设置的,所以过期也会在不同的时间过期,假设第一个key设置时间T1,最后一个key设置时间t2,我们确定第一个key的过期时间至少是MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT,所以所有的key设置超时至少是这个时间,在设置大多数密钥期间,另一个客户端将无法获取锁,因为如果已经存在N/2+1个密钥,则N/2+1 set NX操作无法成功。

2023-06-06 13:55:22 852

原创 第十九章_手写Redis分布式锁

在目标锁对象的计数器不为零的情况下,如果锁对象的持有线程是当前线程,那么 Java 虚拟机可以将其计数器加1,否则需要等待,直至持有线程释放该锁。是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。不同进程jvm层面的锁就不管用了,那么可以利用第三方的一个组件,来获取锁,未获取到锁,则阻塞当前想要运行的线程。指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁。

2023-06-01 10:06:23 905

原创 第十八章_Redis缓存预热+缓存雪崩+缓存击穿+缓存穿透

第一次来查询uid:abcdxxx,redis和mysql都没有,返回null给调用者,但是增强回写后第二次来查uid:abcdxxx,此时redis就有值了。如果发生了缓存穿透,我们可以针对要查询的数据,在Redis里存一个和业务部门商量后确定的缺省值(比如,零、负数、defaultNull等)。黑客会对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到数据库去查询。,但是请求每次都会打到数据库上面去,导致后台数据库压力暴增,这种现象称为缓存穿透,这个redis变成了一个摆设。

2023-05-26 10:56:10 1372

原创 SpringBoot + Docker 实现一次构建到处运行

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。Dockerfile 的本质就是将一系列修改、安装、构建、操作的命令整合到一起,去构建一个个性化的镜像,以达到。最重要的是一致的运行环境。:指定基础镜像,项目是使用jdk8开发的项目,所以指定的基础镜像为openjdk:8-jre。搭建以及配置完成后,需要将之前构建的镜像上传至自己的Docker仓库。也可以在刚刚搭建的WebUI上可视化的查看的镜像。

2023-05-25 15:06:29 1469

原创 第十七章_Redis布隆过滤器BloomFilter实战

使用多个hash函数对key进行hash运算得到一个整数索引值,对位数组长度进行取模运算得到一个位置,每个hash函数都会得到一个不同的位置,将这几个位置都置1就完成了add操作。布隆过滤器的误判是指多个输入经过哈希之后在相同的bit位置1了,这样就无法判断究竟是哪个输入产生的,因此误判的根源在于相同的 bit 位被多次映射且置 1。因为删掉元素会导致误判率增加,因为hash冲突同一个位置可能存的东西是多个共有的,你删除一个元素的同时可能也把其它的删除了。发现存在黑名单中的,就执行特定操作。

2023-05-19 14:42:10 726

实现了网页版的人脸识别登录应用

基于前后端分离Web端项目,主要实现了网页版的人脸登录,通过调取前端摄像头拍照,传入后台进行跟数据库人脸库的相似度比对,技术的用点:Springboot,Mysql,JWT,VUE 2.X 等等技术实现,主要功能点:人脸列表CRUD,日志列表CRUD,基于自建人脸库通过base64编码方式存储人脸图片,通过调用腾讯云人脸对比API场景实现

2023-02-24

SpringBoot + Redis 实现点赞功能的缓存和定时持久化应用

本文基于Springboot利用Redis实现点赞功能的缓存和定时持久化接口。 用户对浏览内容进行【点赞/取赞】,并发送【点赞/取赞】请求到后端,这些信息先存入Redis中缓存,再每隔两小时使用quartz定时框架将Redis中的内容直接写入数据库持久化存储。

2023-02-09

手机号码、邮箱等敏感数据前端显示脱敏处理的解决方案

在我们数据库中有些时候会保存一些用户的敏感信息,比如:手机号、银行卡等信息,如果这些信息以明文的方式保存,那么是不安全的。 假如:黑客黑进了数据库,或者离职人员导出了数据,那么就可能导致这些敏感数据的泄漏 由于我们系统中使用了Mybatis作为数据库持久层,因此决定使用Mybatis的TypeHandler或Plugin来解决 也可以自定义注解实现数据脱敏

2023-02-08

spring-boot自定注解,实现多个数据源之间的自动切换

自定义注解,结合spring-boot-aop,整合druid与mybaits-plus,实现多个数据源在项目中的自动切换。

2022-12-07

shiro框架在项目中的应用

shiro框架在项目中的应用,适用于shiro框架的入门学习以及在项目中的基本应用

2022-11-09

spring的自动获取数据源,实现读写分离

spring的自动获取数据源,切换数据源、实现数据库的读写分离

2018-02-02

shiro框架的基础学习

shiro框架的基础学习、包含shiro框架的认证、授权、session管理、缓存管理

2018-02-02

Myktv管理系统

KTV管理系统,切歌,播放,重播,点歌。

2015-09-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除