【深入理解RabbitMQ】七大工作模式 简单模式工作队列订阅与发布模式路由模式主题模式RPC模式发布确认模式特点:指的是提供者可靠投递到交换机的过程,不会因为网络或者其他问题导致消息丢失。在这个模式下,可以在提供者注册一个回调函数。当消息发送后,不管如何都会触发这个回调函数,可以通过这个回调函数来判断是否到达交换机。应用场景:适用于需要确保消息可靠投递到交换机的场景。发布确认机制是RabbitMQ的七大工作模式之一.生产者将信道设定为confirm(确认)模式信道进入confirm。
【手写一个spring】spring源码的简单实现--BeanPostProcessor(实现AOP)以及JDK动态代理/CGLIB动态代理 spring容器会在目标类实现了接口的时候,默认选择JDK动态代理;在目标类没有实现接口的时候,默认选择CGLIB动态代理;CGLIB是基于字节码生成来创建代理类的JDK动态代理是基于反射来创建代理类的,JDK生成代理类的开销相较于CGLIB相对较小;CGLIB代理的实际方法的调用上性能更高,因为他是通过字节码操作减少了反射调用的开销;CGLIB动态代理需要额外引入CGLIB库依赖,而JDK动态代理是JDK标准库中的一部分,无需引入额外的依赖.finalCGLIB动态代理无法代理final类或。
【spring的底层原理】Bean的生命周期 BeanBean元信息配置:定义Bean的配置信息,包括类名、作用域、依赖等。Bean元信息解析:将配置信息解析成Spring内部的结构。Bean注册:将注册到Spring容器中。合并:类似于面向对象中的继承,一个可以继承另一个的属性。注册Bean对象的信息,生成对象调用构造方法,实例化Bean对象属性注入(@Autowird,构造方法注入,setter方法注入)调用Aware回调方法调用注解或者实现的接口方法初始化调用中的方法,实现AOP。
【手写一个spring】spring源码的简单实现--初始化机制,回调机制 这个操作符返回一个布尔值:如果对象是指定类型的实例,或者是指定类型子类的实例,则返回 true;初始化时自动调用相应的回调方法,并将相关的上下文或资源对象传递给。接口:如果实现,直接强制类型转换后,对该方法进行调用.这种机制为开发者提供了一种灵活的方式来管理和控制。框架中,回调机制是一种强大的特性,它允许。生命周期管理的一个重要组成部分。接口,如果实现了,调用该方法即可。对象的创建和依赖注入后,判断该。,如资源分配、状态设置等。对象的创建过程中执行的呢?接口,并且重写了其中的。机制的接口进行调用呢?
【手写一个spring】spring源码的简单实现--bean对象的创建 我们在第一步中,调用了该类的无参的构造方法之后,,那么直接在容器启动的过程中进行实例化,并且。的,那么我们该如何实现依赖注入这一行为呢?的代码实现:后续我们还会进行补充.等,在后续的章节中我们会仔细讲解.对象的创建过程远不止与此,还包括。管理的对象可以接收到另一个被。假设,此时我们要实例化的对象。维护的池中,方便后续的查找。框架中的一个核心概念,它。对象后,是直接实例化一个。,存在需要依赖注入的属性。容器管理的对象,它们由。所以,我们先生成一个对。的概念,也就是将一个被。,我们可以来描述一个。
【手写一个spring】spring源码的简单实现--容器启动 今天开启一个新的章节,手写一个简易版的spring,帮助大家对spring能有一个更深层次的理解.我将分为以下几个章节进行学习:容器启动。
【JavaSE】java对象的比较 因此其内部的元素必须要能够比大小,方法虽然可以进行比较,但是只能进行。这里我们看到,调用了关键方法。的比较.那么为什么可以进行。在类的外部构造一个比较器。的引用类型不能直接进行。
【Redis】内存淘汰策略 Redis内存淘汰策略是指当Redis的内存使用达到其配置的最大内存限制maxmemory)时,Redis根据预设的策略自动删除一部分键(key)及其对应的值(value,以释放内存空间,从而避免内存溢出(OOM)错误的发生。Redis提供了多种内存淘汰策略,以满足不同应用场景的需求。
【Redis】实现一个分布式锁(上) Tomcat是一个开源的、轻量级的Web服务器和Servlet容器.Tomcat本身是一个Java应用程序,它运行在JVM中,并管理着其内部所有Web应用程序的生命周期TomcatServlet容器Tomcat作为一个Servlet容器,能够执行。Servlet是一种用于扩展Web服务器功能的Java类,它能够对来自Web客户端(如浏览器)的请求进行响应。JSP容器Tomcat还支持JSP技术,允许在HTML页面中嵌入Java代码,以动态生成Web页面。当JSP页面首次被访问时,Tomcat。
【Redis】数据结构(下) 是一个节点为ZipList的双端链表节点采用了ZipList,解决了传统链表的内存占用问题控制ZipList的大小,解决连续内存空间申请效率的问题中间节点可以压缩,进一步节省内存跳表是一个双向链表,每个节点都会包含一个score(用于排序)和ele(真实数据)值节点按照score值排序,score值一样则按照ele字典进行排序每个节点都可以包含多层指针,层数是1~32之间的随机数不同层指针到下一个节点的跨度不同,层级越高,跨度越大增删查改的效率和红黑树基本一致,实现却很简单。
【Redis】数据结构(中)----ZipList(压缩列表) 压缩列表可以看做是一种连续内存空间的"双向链表"列表的节点之间不是通过指针链接,而是记录上一节点和本节点的长度来寻址内存占用较低如果列表数据过多,导致链表过长,可能影响查询性能增或者删除较大数据时,都可能会发生连锁更新的问题。
【JavaSE】Java的基础概念 在Java中,JVM虚拟机可以理解的代码叫做字节码(扩展名为.class的文件),字节码并不面向任何特定的处理器,只面向虚拟机Java通过字节码的方式,在一定程度上解决了传统解释性语言执行效率低的问题解释型语言vs编译型语言编译型语言:源代码在执行前需要通过编译器转换成机器语言或中间代码。预处理阶段,源代码在运行前被完整地编译成目标代码(通常是机器码)。执行时,直接以机器码形式运行,不需要在运行时再次翻译。源代码在运行时由解释器逐行或逐块转换成机器语言并立即执行。
【技术】一文详解Cookie,Session,Token(上) 比如:我们在做在线购物网站项目或者其他需要登录信息验证的项目时,当我们登录页面进行登录之后,如果我们希望后续所有的页面都维持登录的状态,我们一般会使用cookiesessiontoken来实现, 如果我们都不使用,那么维持用户的登录信息是十分麻烦的,以下举例说明。
【多线程】线程池(上) 对于线程池的管理和使用,我们使用在下的线程池工具类来进行线程池的创建和管理//成员属性://核心线程数//最大线程数//非核心线程的最大存活时间//工作队列//线程工厂//拒绝策略//...//线程池的构造方法://...:任务队列未达到队列最大容量时,最大可以同时运行的线程数量:任务队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数workQueue。
【JVM】内存模型 在前面的学习中,我们知道了字节码文件()会通过类加载器加载到虚拟机中,接下来虚拟机就会执行其中的字节码指令.我们把虚拟机被分配的内存叫做运行时数据区域而内存模型就是指运行时数据区域中被划分的不同区域.版本:字符串常量池存放在方法区中,方法区存放在堆中;版本:方法区脱离堆,单独占用一部分内存字符串常量池依旧存储在堆中版本:方法区发生移动,从虚拟机内存中,移动到本地内存中虚拟机()的内存模型是程序运行时内存管理的基础。它定义了程序如何在内存中分配、使用和回收资源。保存在中实现的方法采用栈的数据
【多线程】AQS(上) AQS是将暂时无法请求共享资源的线程封装成一个CLH队列(虚拟的双向队列)的一个节点来实现锁的分配根据volatile修饰的state共享变量,线程通过CAS去改变状态.如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现,即将暂时获取不到锁的线程加入到队列中,等待被唤醒下篇我们会通过源码进行详细的分析。
【JVM】一文详解类加载器 Java中的类加载机制是指在Java程序运行时,将类文件(通常是.class文件)加载到内存中的一系列步骤和过程。这一机制确保了类能够在需要的时候被正确、安全地加载到Java虚拟机(JVM)中,并进行初始化和使用。Java的类加载机制遵循着“按需加载”原则,即只有在需要用到某个类的时候,才会加载该类。是Java的核心组件,所有的Class都是由进行加载的,负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的对象实例。jvm虚拟机对class文件采用的是按需加载。