- 博客(72)
- 资源 (19)
- 收藏
- 关注
原创 实战:Spring Boot中实现SSO(Single Sign-On)单点登录
单点登录是一种身份验证服务,允许用户使用一组凭据登录一次,然后在多个应用程序中访问其他应用程序而无需重新进行身份验证。这样,用户只需一次登录即可访问整个应用生态系统,提高了用户体验并简化了身份验证过程。通过本文,我们学习了如何使用Spring Boot框架实现SSO单点登录。我们创建了一个简单的认证中心和一个服务提供者,并集成了多个服务提供者。这样,用户只需一次登录即可访问整个系统,提高了用户体验。
2024-01-19 13:41:17
2520
原创 构建三高架构:高性能、高可用、高可扩展
高性能、高可用和高可扩展性是构建强大系统的核心,通过优化系统设计、并发处理、负载均衡、冗余备份、缓存和弹性扩展等手段,我们可以构建出更加稳健和高效的系统,满足不断增长的用户需求。在构建高性能系统时,首要考虑的是系统的整体设计。这个例子展示了如何使用 Java 的 HashMap 来实现一个简单的缓存,从而减少对数据库等资源的频繁访问,提高系统性能。在这个例子中,DataStorage 类负责将数据存储到主服务器,并同步数据到备份服务器,以保障数据的完整性和可用性。这样的优化能够有效提高系统的响应速度。
2024-01-10 08:56:34
1663
1
原创 java中反射的实际应用
1.1 什么是反射?在Java编程中,反射是指程序在运行时(runtime)能够获取、检查和操作类、方法、字段等类的属性的能力。传统的Java编程是在编译时确定类的信息,而反射允许在运行时动态获取和操作类的信息。1.2 为什么要使用反射?使用反射可以实现更灵活、动态的代码。它允许在运行时查看类的结构,创建实例,调用方法,操作字段等。这种灵活性在一些框架、库和工具中得到广泛应用,比如Spring框架、ORM(对象关系映射)工具等。1.3 Java中的反射机制。
2024-01-10 08:45:57
1474
原创 Java中的异常处理与最佳错误管理策略
当谈到编写高质量的Java代码时,异常处理和错误管理是至关重要的方面。Java提供了强大的异常处理机制,使开发人员能够更好地管理和处理应用程序中的错误情况。在本文中,我们将深入探讨Java中的异常处理以及最佳的错误管理策略,并提供详细的代码示例。
2024-01-04 15:34:09
537
原创 深入理解Java中的多线程编程与并发控制
Java 中的多线程编程和并发控制是一个广阔的领域,本文只是介绍了其中的一部分内容。在实际开发中,合理地利用多线程和并发机制可以提高程序的性能和效率,但也需要注意并发问题和线程安全性。深入理解并掌握多线程编程是 Java 开发人员必备的技能之一。通过合适的同步机制、并发容器以及对常见并发问题的处理,可以更好地编写出高效、稳定的多线程程序。
2024-01-04 14:43:42
439
原创 Java中常见的设计模式及其实际应用
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,使得算法可独立于使用它的客户而变化。建造者模式用于构建复杂对象,将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。观察者模式用于对象之间的一对多依赖关系,当一个对象状态改变时,其依赖对象会得到通知并自动更新。原型模式用于创建对象的一种方式,通过复制现有对象来生成新对象,避免了构造函数的执行。适配器模式允许接口不兼容的类能够一起工作,将一个类的接口转换成客户希望的另一个接口。
2024-01-04 11:59:41
3231
原创 如何在 Spring Boot 中利用虚拟线程
当谈到虚拟线程和Spring Boot结合时,Kotlin的协程库是一个强大的选择。下面我们来创建一个基于Kotlin协程的Spring Boot应用程序,并展示虚拟线程在异步处理和数据库操作中的应用。虚拟线程是一种轻量级的并发执行单元,它们不同于传统线程,可以在执行期间挂起和恢复。协程是一种编程概念,可以看作是轻量级的线程,能够在执行过程中暂停和恢复。这个示例中,您可以使用/users端点来测试基于Project Loom的Fiber(纤程)在异步创建用户和获取用户数据时的效果。
2024-01-04 09:50:44
1535
1
原创 解析:Eureka的工作原理
每个服务提供者都需要在启动时,配置一个Eureka Client,通过与Eureka Server建立长连接,将自身的服务元数据信息发送给Eureka Server。当一个服务提供者启动时,Eureka Client会向Eureka Server发送注册请求,并将该服务提供者的元数据信息一并发送过去。以后,该服务提供者每次请求Eureka Server进行注册时,都会带上这个service ID,以便Eureka Server能够快速识别该服务提供者。下面将详细介绍Eureka的工作原理。
2024-01-04 09:08:41
1321
原创 使用MyBatis实现动态SQL查询的最佳实践
动态SQL是MyBatis强大而灵活的特性之一,通过合理运用if、choose、when、otherwise等元素,可以根据不同条件构建出各种灵活的SQL查询语句。结合最佳实践,可以使得代码更加安全、可读性更高、更易维护。
2024-01-03 18:28:35
812
原创 SpringBoot解决定时任务阻塞问题
但是,当多个任务同时运行时,可能会出现阻塞的情况,特别是当一个任务的执行时间超过了预期,导致其他任务无法按时执行。通过合理配置线程池、优化任务执行时间、异步执行任务以及进行监控和日志记录,可以有效地解决Spring Boot应用中多个定时任务阻塞的问题。可以将耗时的任务标记为异步,让它们在独立的线程中执行,不影响其他任务的执行。为了避免任务之间的相互影响和阻塞,可以配置多个线程池来管理定时任务的执行。分解任务:将长时间执行的任务分解成多个小任务,分批次执行,避免长时间占用线程。
2024-01-03 18:08:41
1259
原创 使用Spring Security实现SSO单点登录
本文演示了如何在Spring Boot应用程序中实现基于OAuth2的SSO。通过使用Spring Security和OAuth2客户端,我们能够配置应用程序以与身份提供者进行通信,并实现单点登录功能。
2024-01-03 09:01:11
1117
原创 确保数据安全性与系统稳定性:在Spring Boot中实现API幂等性的完整指南
幂等性是指相同的操作在多次执行下产生相同的结果,无论操作执行的次数是一次还是多次,最终的系统状态都是一致的。在Web开发中,幂等性通常用来保证对服务器的请求不会引起意外的副作用,即使请求被多次发送。
2024-01-03 08:56:20
899
原创 SpringBoot中怎么进行接口异常重试?实战
在Spring Boot中进行接口重试可以通过多种方式实现。重试机制是处理网络不稳定性或外部服务故障时的常用方法。以下是一种基于Spring Retry的方法,允许你在调用失败时自动进行重试。
2024-01-02 08:59:42
583
原创 深入探讨在SpringBoot中分布式锁的实现与应用
当在Spring Boot 中使用分布式锁时,你可以借助各种库和技术来实现。其中,Redis 和 ZooKeeper 是两个常用的分布式锁实现工具。下面将展示如何在 Spring Boot 中使用这两种工具实现分布式锁。
2023-12-29 17:56:24
1319
原创 JUnit 5和Mockito单元测试
通过JUnit 5和Mockito,我们能够轻松地编写详细的单元测试。这种实践有助于确保代码在各种情况下都能按预期工作。JUnit 5提供了丰富的断言功能,而Mockito则帮助我们模拟和隔离依赖,从而更全面地测试代码。结合使用这两个工具,能够提高代码质量并降低潜在的错误风险。
2023-12-29 15:35:10
956
原创 Spring Boot应用程序中实现多态切换多数据源
创建一个自定义注解@DataSource来标记需要使用的数据源。在Service层的方法上使用@DataSource注解来指定使用的数据源。@Service@Autowired@Autowired通过以上步骤,我们成功地实现了在Spring Boot应用程序中动态切换多个数据源的功能。使用自定义注解和AOP切面,我们可以轻松地在不同的方法中切换数据源,满足不同业务需求。记得在实际生产环境中测试和优化这些配置,确保其稳定性和性能。
2023-12-29 15:12:23
1111
3
原创 Spring Boot中关闭Job任务
在作业执行期间,通过 shouldStopJob() 方法模拟某个条件,当满足这个条件时,调用 transactionManager.rollback(status) 来回滚事务,并中止作业。如果一个作业(Job)中涉及到事务操作,并且你需要在中止作业时处理这些事务,你可以考虑使用事务管理器,并在中止作业时进行事务回滚。确保在处理事务时考虑到异常情况,以保证数据的完整性。可以通过 @Transactional 注解来管理事务,在中止作业时,通过 Spring 的事务管理器进行事务回滚。
2023-12-29 08:54:47
1286
原创 聊一聊Spring Bean 的生命周期
当你使用Spring框架时,Bean生命周期是其中一个重要的概念。Bean的生命周期指的是一个Bean实例从被创建到被销毁的整个过程。理解Spring Bean的生命周期对于掌握Spring框架的核心概念至关重要。
2023-12-28 08:59:46
496
原创 SpringBoot:基于悲观锁和数据库乐观锁简单的电商秒杀系统设计实战
以上代码只是一个简化的示例,实际的秒杀系统需要更多功能和安全性措施,比如并发控制、防止超卖、接口安全性等。此外,还需要框架来处理前端交互和后端业务逻辑,比如使用Spring框架来构建整个应用。假设我们有三张表:user(存储用户信息)、product(存储商品信息)、order(存储订单信息)。对于一个完整的实战系列,建议你查阅相关的课程、书籍或在线教程,深入学习并实践这些概念和技术。
2023-12-27 08:55:07
566
原创 Redis与Memcached对比:内存键值存储系统的功能对比与选择指南
Redis和Memcached都有其独特的优势和适用场景。Redis提供更多的数据类型和复杂操作支持,适用于多种场景,但相对更复杂和消耗更多资源。而Memcached简单高效,适用于单纯的键值对缓存场景,但功能相对较为简单。因此,在选择使用Redis还是Memcached时,您需要考虑到您的具体需求。如果需要更复杂的数据操作和持久化支持,Redis可能是更好的选择。而如果只需简单的缓存需求并追求更快的速度,Memcached可能更适合。同时,根据项目需求和规模,还需要考虑到复制、集群支持和数据安全等因素。
2023-12-26 15:31:40
613
原创 利用策略模式与Spring Boot实现灵活的文件上传功能:多策略选择与动态实现
*@Service@Override// 实现本地文件上传逻辑@Service@Override// 实现云端文件上传逻辑以上示例展示了如何结合策略模式和Spring Boot来实现动态文件上传功能。通过定义不同的上传策略类,您可以根据需要选择特定的上传方式,并且这些策略类可以轻松地替换、扩展或新增,使得系统更加灵活和可维护。
2023-12-26 11:45:11
1277
2
原创 Mysql存储过程 为指定库所有表加统一字段
如果不存在,使用动态 SQL 添加 brand 列,类型为 VARCHAR(100)。对于每个表,检查是否存在名为 brand 的列。使用游标遍历数据库中的所有表。
2023-12-26 08:49:38
638
原创 Lambda表达式:现代编程语言的利器
通过深入理解Lambda表达式的概念、语法结构和应用场景,并结合实际项目的实践经验,开发者可以更好地利用Lambda表达式提高代码质量、可读性和可维护性。在未来的编程实践中,Lambda表达式无疑将继续发挥其重要的作用,成为现代编程语言中不可或缺的利器。在现代编程语言中,Lambda表达式成为了一种强大而灵活的工具,它的引入为编程带来了更为简洁和高效的方式。虽然Lambda表达式提供了一种便捷的语法,但在一些性能敏感的场景中,要谨慎使用Lambda表达式。Lambda表达式通常需要与函数式接口搭配使用。
2023-12-22 08:58:06
1126
原创 深入理解Java动态代理
Proxy 类用于创建动态代理类,而 InvocationHandler 接口用于实现代理类的调用处理逻辑。Java动态代理是一项强大的技术,为我们提供了一种在运行时创建代理对象的灵活手段。动态代理是Java编程语言中的一项强大特性,它允许在运行时创建代理类和实例,而无需在编译时知道代理类的具体类型。动态代理在实际应用中具有广泛的用途,其中最为显著的是在AOP(面向切面编程)中的应用。静态代理在编译时就已经确定代理关系,而动态代理则在运行时生成代理对象。Java动态代理 - Oracle官方文档。
2023-12-21 08:52:20
389
原创 大规模数据查询:MySQL 与 Spring Boot 分页实战
引言随着信息时代的到来,数据量的爆发性增长让分页查询成为数据库操作中的常见需求。数据库查询的效率直接影响着系统性能,因此在实际项目中,我们需要精心选择和使用分页查询方法。本文将深入研究在 MySQL 数据库中如何进行分页查询,并结合 Spring Boot 框架实现分页功能。我们将比较不同的分页方法的用法和性能,以便在实际项目中做出明智的选择。**
2023-12-20 09:04:17
1438
原创 低代码开发:解析其崛起、争议与未来趋势
在这个争议不断的话题中,我们将深入探讨低代码的真实面貌,分析其对行业和程序员的影响。低代码的兴起并非意味着程序员将被取代,相反,它为程序员创造了新的机会。低代码将开发过程的抽象层次提高到更高的层次,使得程序员可以更专注于业务逻辑、创新和解决问题,而不是过多关注底层的技术细节。未来的低代码平台将更加注重智能化和自动化,通过引入人工智能和机器学习技术,提供更强大的自动化工具,减轻开发人员的负担。低代码的使用可以使程序员更高效地完成日常任务,将更多时间投入到创造性的工作上,推动项目和业务的发展。
2023-12-19 17:58:01
386
原创 实战:使用Spring Boot监控SQL执行
Spring Boot作为一个流行的Java开发框架,提供了丰富的功能和便捷的配置,使得开发者能够更轻松地构建应用程序。在实际项目中,SQL执行的监控是一个重要的需求,可以帮助我们分析和优化数据库访问性能。在afterCompletion方法中,计算了整个请求的执行时间,并记录了数据库的URL和执行时间。在这个例子中,我们使用Spring Boot Starter Data JPA作为数据访问的基础,以及H2数据库作为演示用的数据库。创建一个拦截器,用于监控SQL的执行时间和语句。配置拦截器,使其生效。
2023-12-19 13:14:32
1007
原创 MyBatis拦截器详解与实例演示
在本文中,我们将深入探讨MyBatis拦截器的原理,并通过一个实例演示如何创建一个拦截器,用于记录SQL执行时间。在上面的例子中,我们创建了一个SqlTimingInterceptor类,实现了MyBatis的Interceptor接口。通过@Intercepts注解,我们指定了拦截的目标方法,这里选择了update和query方法,即SQL语句的执行和查询方法。这个注解接受一个@Signature数组作为参数,每个@Signature定义了一个要拦截的方法的签名信息,包括目标类型、方法名和参数类型。
2023-12-19 13:07:51
1131
原创 面试官问实现分布式锁有哪些?
面试经常被问到分布式锁,今天我就带大家深入剖析下分布式锁的各种方案。什么是分布式锁概述 为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。怎样实现分布式锁1.基于数据库实现分布式锁2.基于缓存实现分布式锁3.基于Zookeeper实现分布式锁一、基于数据库实现分布式锁首先新建一个数据库表,可以通过数据库的排他锁来实现分布式锁。基于MySql的InnoDB引擎,可以使用以下方法来实现加锁操作:在
2022-04-08 10:08:28
323
原创 如何保证Redis缓存和数据库一致性?
首先我们先了解下缓存是什么?缓存就是把低速存储的结果,临时保存在高速存储的技术。为什么使用redis进行缓存数据?Redis嘛,就是一种运行速度很快,并发很强的跑在内存上的NoSql数据库,支持键到五种数据类型的映射,(string、list、set、zset、hash),而memecache只能支持简单的数据类型。另外redis可以完成一部份数据的持久化,而memecache完全将数据保存在内存中,不进行持久化,如果服务器出问题,数据将全部丢失,另外一个原因是redis底层实现优化比memecach
2022-04-07 08:37:14
20378
3
原创 面试官问的Java8的新特性你真的了解了吗?
Java 8是Java自Java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特性。我们平时开发也主要使用的是这个版本进行开发,今天我们就来讲讲这些新特性都有哪些以及在平时开发是怎么样使用的。一、Lambda表达式和函数式接口在Java8中最经常看到和被猿人们使用的就是Lambda表达式了,也是面试过程中比较平常的回答。那它是怎么使用的呢?最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,如果Lambda表达式需要更.
2022-04-06 10:29:06
631
原创 Java 计算年月日和与年月日之间的天数
在平时开发中,我们经常会遇到计算时间的情况,通常用来判断过期时间,有效时间等,话不多说,上代码/** * 计算两个日期之间相差的整数,日期是××××年××月××日00时00分00秒 如果不足一个月按照一个月计算 */ public static int betweenMonth(Date begin, Date end) { Calendar begin= Calendar.getInstance(); begingc.setTime(begin); int beginYear =
2021-06-27 21:15:14
1069
原创 面试官问:“Elasticsearch的索引优化你知道吗?“
面试官:想了解应聘者之前公司接触的 ES 使用场景、规模,有没有做过比较大规模的索引设计、规划、调优。解答:如实结合自己的实践场景回答即可。比如:ES 集群架构 13 个节点,索引根据通道不同共 20+索引,根据日期,每日递增 20+,索引:10 分片,每日递增 1 亿+数据,每个通道每天索引大小控制:150GB 之内。仅索引层面调优手段:1.1、设计阶段调优1、根据业务增量需求,采取基于日期模板创建索引,通过 roll over API 滚动索引;2、使用别名进行索引管理;3、每天凌晨定时
2021-05-03 22:06:37
412
1
原创 MyBatis 的接口绑定以及实现方式
前提:使用 MyBatis 的 mapper 接口调用时有哪些要求1、Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同;2、Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的parameterType 的类型相同;3、Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的resultType 的类型相同;4、Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。
2021-04-04 09:29:36
1670
原创 MyBatis高能——一对一和一对多的方式详解
使用数据库:mysql首先我们来看一下相关的代码实现:<mapper namespace="com.lcb.mapping.userMapper"><!--association 一对一关联查询 --><select id="getClass" parameterType="int"resultMap="ClassesResultMap">select * from class c,teacher t where c.teacher_id=t.t_id an
2021-04-04 09:25:55
2342
原创 vue 声明结构体数组
data () { return { structArray: [],// ··· 1 unit: {id: '', name: ''}, structArray2: unit[10]// ··· 2 }}如上,若想要structArray为一个结构体数组,比如[{id: ‘1’, name: ‘a’}, {id: ‘2’, name: ‘b’}, {id: ‘3’, name: ‘c’}]该如何声明?使用1
2021-03-30 13:05:08
4651
原创 jQuery选项卡切换实现代码
js:$("ul.list li").click(function() { // 先消除全部的checked类,使其处于空白状态 $("ul.list li").removeClass("checked"); // 点击那个选项就在里面添加一个checked类 // 注:this??>谁调用指向谁 $(this).addClass("checked"); // 原理同上,消除main里面的内容 $(".main>div").css(
2021-03-30 12:57:47
197
原创 关于Redis一整套数据结构整理
redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库。它支持包括String、List、Set、Zset、hash五种数据结构。除此之外,通过复制、持久化和客户端分片等特性,用户可以很方便地将redis扩展成一个能够包含数百GB数据和每秒处理上百万次的请求的系统。Geospatial:把某个具体的位置信息(经度,纬度,名称)添加到指定的key中,数据将会用一个sorted set存储,以便稍后能使用 GEORADIUS和 GEORADIUSBYMEMBER命令
2021-03-28 10:05:46
203
原创 面试官都在问的MQ通信你真的会吗?——大家都在用的RabbitMQ
1、什么是 RabbitMQ采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦2、为什么要使用 RabbitMQ1、在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;2、拥有持久化的机制,进程消息,队列中的信息也可以保存下来。3、实现消费者和生产者之间的解耦。4、对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。5.可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下
2021-03-27 20:17:59
494
深入理解Vue.js核心概念及性能优化策略
2023-12-26
SpringBoot+Mybatis -plus+Mysql+Vue渲染整合
2020-11-04
Json所需6个JAR包(net.sf.ezmorph.MorpherRegistry异常).rar
2020-05-26
资源统计项目springbootJPA+mysql+layui.rar
2020-05-20
电商网站Java+mybatis+mysql.rar
2020-05-20
NamedParameterJdbcTemplate使用
2024-01-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人