自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 Spring Cloud Gateway

Spring Cloud Gateway 和 Zuul 2.x 的差别不大,也是通过过滤器来处理请求。不过,目前更加推荐使用 Spring Cloud Gateway 而非 Zuul,Spring Cloud 生态对其支持更加友好。Spring Cloud Gateway 不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,限流。SpringCloud Gateway 属于 Spring Cloud 生态系统中的网关,其诞生的目标是为了替代老牌网关。

2024-10-31 19:53:55 451 1

原创 操作系统基础

很多人容易把操作系统的内核(Kernel)和中央处理器(CPU,Central Processing Unit)弄混。

2024-10-30 19:00:55 160

原创 ConcurrentHashMap 能保证复合操作的原子性吗?

那么最终的结果是 (key, value),而不是预期的 (key, anotherValue)。这就是复合操作的非原子性导致的问题。这些方法都可以接受一个函数作为参数,根据给定的 key 和 value 来计算一个新的 value,并且将其更新到 map 中。是线程安全的,意味着它可以保证多个线程同时对它进行读写操作时,不会出现数据不一致的情况,也不会导致 JDK1.7 及之前版本的。但是,这并不意味着它可以保证所有的复合操作都是原子性的,一定不要搞混了!提供了一些原子性的复合操作,如。

2024-10-29 19:33:58 308

原创 Java IO 设计模式总结

IO 流中的字符流和字节流的接口不同,它们之间可以协调工作就是基于适配器模式来做的,更准确点来说是对象适配器。更侧重于让接口不兼容而不能交互的类可以一起工作,当我们调用适配器对应的方法时,适配器内部会调用适配者类或者和适配类相关的类的方法,这个过程透明的。更侧重于动态地增强原始类的功能,装饰器类需要跟原始类继承相同的抽象类或者实现相同的接口。装饰器模式通过组合替代继承来扩展原始类的功能,在一些继承关系比较复杂的场景(IO 这一场景各种类的继承关系就比较复杂)更加实用。,作用于适配者的对象或者类称为。

2024-10-28 19:00:56 391

原创 Shiro会话管理和加密

Apache Shiro是一个强大且易于使用的Java安全框架,提供了认证、授权、加密和会话管理等多种安全功能。Shiro框架的核心组件之一是会话管理,同时它也提供了多种加密方式和工具,帮助开发者实现数据的加密和解密。Shiro框架提供了强大的会话管理和加密功能,能够帮助开发者实现用户会话的有效管理和数据的安全保护。通过合理配置Shiro的会话管理器和加密工具,可以确保应用程序的安全性,提高系统的稳定性和可靠性。

2024-10-28 14:25:03 288

原创 何谓反射?

不过,反射让我们在运行时有了分析操作类的能力的同时,也增加了安全问题,比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。你获取到注解之后,就可以做进一步的处理。反射可以让我们的代码更加灵活、为各种框架提供开箱即用的功能提供了便利。注解就读取到配置文件中的值呢?究竟是怎么起作用的呢?为什么你使用 Spring 的时候 ,一个。

2024-10-26 22:42:33 228

原创 什么是序列化和反序列化?

JDK 自带的序列化方式一般不会用 ,因为序列化效率低并且存在安全问题。比较常用的序列化协议有 Hessian、Kryo、Protobuf、ProtoStuff,这些都是基于二进制的序列化协议。在反序列化时,也会解析它并做一致性判断,以此来验证序列化对象的版本一致性。如果两者不匹配,反序列化过程将抛出。修饰的变量是静态变量,属于类而非类的实例,本身是不会被序列化的。,因为这通常意味着序列化的类的定义已经发生了更改,可能不再兼容。,如果不手动指定,那么编译器会动态生成默认的。的序列化做了特殊处理。

2024-10-25 15:59:51 277

原创 分布式 ID

日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应一个订单。我们现实生活中也有各种 ID,比如身份证 ID 对应且仅对应一个人、地址 ID 对应且仅对应一个地址。简单来说,。

2024-10-24 18:39:47 178

原创 Shiro授权

RBAC模型通过角色与权限的关联,实现用户与权限的逻辑分离,从而简化权限管理。在RBAC中,有三个核心要素:用户、角色和权限。用户:需要访问系统资源的个体。每个用户都有不同且唯一的ID,用来进行识别,并被授予不同的角色。角色:一组权限的集合,代表某种职责或功能。例如,在企业管理系统中,可以有“管理员”、“普通员工”、“财务人员”等角色。权限:对特定资源的访问能力,如读取、写入、执行等。RBAC通过将权限分配给角色,再将角色分配给用户,从而控制用户对系统资源的访问。

2024-10-23 19:01:11 433

原创 NoSQL 数据库

NoSQL 数据库非常适合许多现代应用程序,例如移动、Web 和游戏等应用程序,它们需要灵活、可扩展、高性能和功能强大的数据库以提供卓越的用户体验。

2024-10-23 15:30:38 254

原创 ConcurrentHashMap 线程安全的具体实现方式/底层具体实现

Java 8 在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为 O(N))转换为红黑树(寻址时间复杂度为 O(log(N)))。只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,就不会影响其他 Node 的读写,效率大幅提升。)的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。,代码量从原来 Java 7 中的 1000 多行,变成了现在的 6000 多行。是一种可重入锁,扮演锁的角色。Java 8 中,锁粒度更细,

2024-10-22 14:59:43 182

原创 类加载过程详解

类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为 7 个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)。而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。所以,在 JVM 生命周期内,由 jvm 自带的类加载器加载的类是不会被卸载的。加载这一步主要是通过我们后面要讲到的。

2024-10-21 20:27:23 789

原创 TCP 与 UDP

是否面向连接:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。 是否是可靠传输:远地主机在收到 UDP 报文后,不需要给出任何确认,并且不保证数据不丢失,不保证是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。 是否有状态:这个和上面的“是否可靠传输”相对应。TCP

2024-10-18 16:52:42 159

原创 什么是负载均衡?

Dubbo 属于是默认自带了负载均衡功能,Spring Cloud 是通过组件的形式实现的负载均衡,属于可选项,比较常用的是 Spring Cloud Load Balancer(官方,推荐) 和 Ribbon(Netflix,已被弃用)。负载均衡服务可以有由专门的软件或者硬件来完成,一般情况下,硬件的性能更好,软件的价格更便宜(后文会详细介绍到)。七层负载均衡比四层负载均衡会消耗更多的性能,不过,也相对更加灵活,能够更加智能地路由网络请求,比如说你可以根据请求的内容进行优化如缓存、压缩、加密。

2024-10-17 19:46:28 1155

原创 数据冷热分离详解

如果你的公司有 DBA 的话,也可以让 DBA 进行冷数据的人工迁移,一次迁移完成冷数据到冷库。然后,再搭配上面介绍的方案实现后续冷数据的迁移工作。数据冷热分离是指根据数据的访问频率和业务重要性,将数据分为冷数据和热数据,冷数据一般存储在存储在低成本、低性能的介质中,热数据高性能存储介质中。冷热分离的思想非常简单,就是对数据进行分类,然后分开存储。热数据是指经常被访问和修改且需要快速访问的数据,冷数据是指不经常访问,对当前项目价值较低,但需要长期保存的数据。

2024-10-16 14:45:17 398

原创 Shiro 认证(Authentication)

1.首先调用subject.login(token)进行登录,其会自动委托给security manager,调用之前必须通过securityUtils.setSecurityManager()设置security manager;springboot+shiro实现动态认证,除了对原CRM项目代码进行细微的调整之外,shiro部分只要做两件事即可:1、自定义realm 2、配置shiro相关对象。System.out.println("身份信息:"+subject.getPrincipal());

2024-10-16 09:13:52 701

原创 线程的生命周期

综上所述,线程的生命周期包括新建状态、就绪状态、运行状态、阻塞状态和死亡状态。这些状态之间的转换通常由线程调度器、线程自身的操作以及外部条件共同决定。了解线程的生命周期有助于程序员更好地理解和控制线程的行为,从而编写出更高效、更可靠的并发程序。:被阻塞的线程会在合适的时候(如阻塞解除后)重新进入就绪状态,等待线程调度器再次调度它执行。线程从阻塞状态只能进入就绪状态,无法直接进入运行状态。:线程在运行过程中,可能会因为某些原因而进入阻塞状态。阻塞状态是线程暂时停止执行的状态。

2024-10-15 18:41:08 317

原创 乐观锁和悲观锁

乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)。悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。不过,大量失败重试的问题也是可以解决的,像我们前面提到的。字段,表示数据被修改的次数。

2024-10-14 18:51:34 374

原创 HashMap 的底层实现

JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。实现导致的碰撞,从而提高数据的分布均匀性。链表的长度大于 8 的时候,就执行。

2024-10-11 19:05:51 355

原创 SpringBoot集成Redis

以上步骤涵盖了如何在Spring Boot项目中集成Redis,并进行了基本的CRUD操作。你可以根据需要进一步扩展和自定义Redis的配置和使用方式。

2024-10-11 18:46:15 152

原创 ArrayList 与 LinkedList 区别?

插入和删除是否受元素位置的影响:

2024-10-10 19:54:26 270

原创 Java 魔法类 Unsafe 详解

Unsafe 是位于 sun.misc 包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升 Java 运行效率、增强 Java 语言底层资源操作能力方面起到了很大的作用。但由于 Unsafe 类使 Java 语言拥有了类似 C 语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用 Unsafe 类会使得程序出错的概率变大,使得 Java 这种安全的语言变得不再“安全”,因此对 Unsafe 的使

2024-10-09 18:53:48 279

原创 JPA+Thymeleaf增删改查

JPA是Java EE 5标准的一部分,它提供了一种将Java对象映射到关系数据库中的表的方法,从而简化了数据持久化的过程。JPA的核心是实体(Entity)和实体管理器(EntityManager),通过它们可以实现对数据库的增删改查操作。实体(Entity):代表数据库中的表,通过注解(如@Entity@Id@Column等)与数据库表进行映射。实体管理器(EntityManager):用于管理实体的生命周期,包括创建、更新、删除和查询实体。

2024-09-25 15:47:51 744

原创 Tyhelea模板引擎

此外,Thymeleaf还支持多种方言,如Spring标准方言、Spring Security方言等,这些方言提供了额外的功能,使得Thymeleaf更加强大和灵活。除了标准和Spring标准方言外,Thymeleaf还支持其他方言,如Spring Security方言、布局方言等,这些方言可以扩展Thymeleaf的功能,使其更加强大和灵活。Thymeleaf支持HTML原型,在原型上添加额外的属性,浏览器在解释HTML时会忽视未定义的属性,当定义的属性有值时就会动态替换静态页面,实现动态展示。

2024-09-20 21:14:36 880

原创 SpringBoot基于Web开发

使用Spring Boot开发Web应用是一个高效且流行的选择,因为它极大地简化了Spring应用的初始搭建以及开发过程。

2024-09-13 17:40:58 569

原创 SpringBoot中Mybatis-Plus与Druid数据源

Mybatis-Plus(简称MP)是Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。它内置了CRUD操作、分页插件、性能分析插件等,极大地减少了数据库操作代码的编写量,提高了开发效率。Druid是阿里巴巴开源的数据库连接池,它提供了强大的监控和扩展功能,包括SQL监控、慢查询日志、扩展JDBC等。Druid在性能、监控和扩展性方面表现优异,是许多大型项目首选的数据源管理工具。

2024-09-09 19:17:05 563

原创 数据访问:JPA关联与MyBatis

JPA是一种Java ORM技术标准,旨在简化数据库访问,减少开发者直接编写SQL语句的需要。它通过注解将Java对象映射到数据库表,并管理对象之间的关系。在Spring Boot中,JPA的实现通常依赖于Hibernate等ORM框架。MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索,通过使用简单的XML或注解将接口和Java的POJOs映射成数据库中的记录。

2024-09-04 16:41:20 1143

原创 数据访问:JPA

JPA(Java Persistence API)是一种用于数据访问的Java应用程序接口规范,它主要关注于将Java对象映射到关系数据库表中,实现数据的持久化。

2024-09-02 14:42:38 731

原创 SpringBoot入门

SpringBoot 是 Spring Framework 的一个子项目,它旨在通过自动配置(auto-configuration)和起步依赖(starter dependencies)来简化 Spring 应用的初始搭建以及开发过程。SpringBoot 使得开发者可以“just run”他们的应用,而无需过多地配置 XML 文件或繁琐的注解配置。

2024-08-28 17:03:06 884

原创 SpringMVC扩展和SSM框架整合

在将日期对象序列化为JSON字符串时,如果使用的是像JavaScript的JSON.stringify()这样的方法,并且日期对象没有被转换为字符串,那么你可能需要自定义序列化函数或使用第三方库(如Moment.js或Date-fns)来将日期转换为ISO 8601格式的字符串。在客户端(如JavaScript),浏览器通常会正确地处理UTF-8编码的JSON数据,但如果你在JavaScript之外处理JSON(比如使用Node.js),同样需要确保处理字符串时使用UTF-8编码。

2024-08-13 20:57:24 679 1

CH13-ConnectionDemo.zip

CH13-ConnectionDemo.zip

2023-09-19

空空如也

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

TA关注的人

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