- 博客(45)
- 收藏
- 关注
原创 设计模式-装饰者模式
装饰者模式:动态的将新功能附加到对象,上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)这里提到的动态的将新功能附加到对象和ocp原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。
2024-04-20 13:18:22
740
原创 设计模式-桥接模式
桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。是一种结构型设计模式Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
2024-04-20 13:17:39
1202
原创 设计模式-适配器模式
适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式类适配器模式、对象适配器模式、接口适配器模式基本介绍: Adapter类, 通过继承src类,实现dst类接口,完成src->dst的适配。基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类, 而是持有src类的实例,以解决兼容性的问题。
2024-04-16 15:57:59
742
原创 设计模式-建造者模式
建造者模式()又叫生成器模式,是一种对象构建模式。它可将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。建造者模式是一步一步创建一个复杂的对象, 它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
2024-04-16 15:57:06
968
原创 设计模式-原型模式
原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即对象.clone()形象的理解:孙大圣拔出猴毛,变出其它孙大圣。
2024-04-15 19:16:04
600
原创 设计模式-工厂模式
简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。
2024-04-15 19:14:48
1189
原创 设计模式-单例模式
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类.只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象。SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,这是就会使用到单例模式。
2024-04-12 13:21:22
1339
原创 设计模式-开闭原则和迪米特法则
开闭原则(Open Closed Principle) 是编程中最基础、最重要的设计原则一个软件实体如类,模块和函数应该对扩展开放(对提供方)对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。一个对象应该对其他对象保持最少的了解类与类关系越密切,耦合度越大迪米特法则(Demeter Principle)又叫最少知道原则。
2024-04-12 13:19:59
593
原创 设计模式-依赖倒置原则
高层模块不应该依赖低层模块,二者都应该依赖其抽象抽象不应该依赖细节,细节应该依赖抽象依赖倒转(倒置)的中心思想是面向接口编程依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。
2024-04-10 18:20:25
575
原创 设计模式-接口隔离原则
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上先看一张图:类A通过接口Interface1 依赖类B,类C通过接口Interface1 依赖类D,如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法。按隔离原则应当这样处理:将接口Interface1拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。
2024-04-09 16:22:44
746
原创 设计模式-单一职责原则
对类来说的,即一个类应该只负责一项职责。如类A负责两个不同的职责,职责1,职责2.当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。
2024-04-09 15:58:07
641
原创 Redis的五种基本数据类型
举例其中一点,SDS 中,O(1)时间复杂度,就可以获取字符串长度;而 C 字符串,需要遍历整个字符串,时间复杂度为 O(n)C 语言的字符串是 char[]实现的,而 Redis 使用。结构,而 C 语言原生的 char[]不香吗?Redis 为什么选择。
2024-04-07 19:17:09
625
原创 JVM类的加载过程
所有的类都会优先加载基类静态成员的初始化优先成员初始化完后,才会执行构造方法静态成员的初始化与静态块的执行,发生在类加载的时候,静态成员的优先级大于静态块类对象的创建以及静态块的访问,都会触发类的加载执行顺序静态成员变量 -> 静态代码块 -> 成员变量 -> 构造方法。
2024-04-07 11:26:38
956
原创 SpringBoot整合RabbitMQ
演示队列在需要延时处理的场景下非常有用,使用 RabbitMQ 来实现延时队列可以很好的利用 RabbitMQ 的特性,如:消息可靠发送、消息可靠投递、死信队列来保障消息至少被消费一次以及未被正确处理的消息不会被丢弃。另外,通过 RabbitMQ 集群的特性,可以很好的解决单点故障问题,不会因为单个节点挂掉导致延时队列不可用或者消息丢失。
2024-04-06 12:26:22
577
原创 RabbitMQ死信队列
死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue 中,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息没有后续的处理,就变成了私信,有死信自然就有了死信队列。应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息消费发生异常时,将消息投入死信队列中。
2024-04-06 11:58:38
524
原创 RabbitMQ交换机
尽管使用 direct 交换机根据 routingKey 发到指定的队列,但是它仍然存在局限性,比如所我们只想接收 info.base 的消息,但是只要 routingKey 是 info 的就会全部接收,这个时候就只能使用topic类型。Fanout这种交换类型并不能给我们带来很大的灵活性 - 它只能进行无意识的广播,在这里我们将使用direct 这种类型来进行替换,这种类型的工作方式是,消息只去到它绑定的routingKey队列中去。它是将接收到的所有消息广播到它知道的所有队列中。
2024-04-05 12:26:09
1018
原创 RabbitMQ基于Java实现消息应答
单独发布消息:同步等待确认,简单,但吞吐量非常有限批量发布消息:批量同步等待确认,简单,合理的吞吐量,一旦出现问题很难知道具体是哪条消息出现了问题异步处理:最佳性能和资源使用,在出现错误的情况下可以很好地控制,但是实现较复杂。
2024-04-05 12:22:14
1768
原创 MQ的作用及分类
这两种方式都不是很优雅,使用消息总线,可以很方便解决这个问题,A调用B服务后,只需要监听B处理完成的消息,当B处理完成后,会发送一 条消息给MQ, MQ会将此消息转发给A服务。A服务还能及时的得到异步处理成功的消息。优点:单机吞吐量十万级,可用性非常高,分布式架构,消息可以做到0丢失,MQ功能较为完善,还是分布式的,扩展性好,支持10亿级别的消息堆积,不会因为堆积导致性能下降源码是java我们可以自己阅读源码,定制自己公司的MQ 缺点:支持的客户端语言不多,目前是java及c++,其中c++不成熟;
2024-04-04 13:53:14
1080
原创 Netty的实现图解
NIO中实现多路复⽤的核⼼类是Selector,当多路复⽤器Selector调⽤select⽅法时,将会查找发⽣事件的channel,问题是,该如何在多个注册到selector上的channel中找到哪些channel发⽣了事件,此时NIO不同的版本有不同的做法。
2024-02-01 21:24:51
355
原创 初识Netty
我们在使⽤NIO做同步⾮阻塞式的⽹络通信时,会发现NIO实现起来⾮常复杂。整个NIO的过程包含着繁琐的步骤,且需要同时掌握好各种API的使⽤,⽐如Selector、ServerSocketChannel、SocketChannel及ByteBuffer等。从之前的几篇关于NIO的文章可以看出,还没有实现业务,光写整个流程就⾮常繁琐。
2024-01-30 17:22:30
632
原创 Java-AIO
Asynchronous IO也称为AIO,即异步⾮阻塞IO。Java7提供了改进版的NIO,引⼊了异步⾮阻塞的IO,由操作系统完成后回调通知服务端程序启动线程去处理。⼀般适⽤于连接数较多且连接时间较⻓的应⽤。
2024-01-29 16:40:09
719
原创 NIO-Selector详解
Selector选择器,也可以称为多路复⽤器。它是Java NIO的核⼼组件之⼀,⽤于检查⼀个或多个Channel的状态是否处于可读、可写、可连接、可接收等。通过⼀个Selector选择器管理多个Channel,可以实现⼀个线程管理多个Channel对应的⽹络连接。使⽤单线程管理多个Channel可以避免多线程的线程上下⽂切换带来的额外开销。
2024-01-27 17:06:41
1313
原创 NIO-Buffer详解
Buffer缓冲区实际上是内存中开辟的⼀块数组空间,⽤于存放数据。Java NIO中的buffer类提供了对这块数组缓冲区的基本操作。IO流的操作⾯向的是流对象,⽽NIO操作的数据都是⾯向Buffer缓冲区的。也就是说,读取数据是通过通道将数据存⼊到buffer中。写数据是将buffer缓冲区中的数据通过通道写到⽂件中。Java NIO提供了所有缓冲区的抽象基类Buffer。
2024-01-26 12:48:53
820
1
原创 NIO-Channel详解
⽤于读取、写⼊、映射和操作⽂件的通道。⽂件通道是连接到⽂件的可搜索字节通道。它在其⽂件中有⼀个当前位置,可以查询和修改。⽂件本身包含可变⻓度的字节序列,可以读取和写⼊,并且可以查询其当前⼤⼩。当写⼊的字节超过其当前⼤⼩时,⽂件的⼤⼩增加;⽂件被截断时,其⼤⼩会减⼩。⽂件还可能具有⼀些相关联的元数据,如访问权限、内容类型和上次修改时间;此类不定义元数据访问的⽅法。除了熟悉的字节通道读、写和关闭操作外,此类还定义了以下⽂件特定操作:字节可以以不影响通道当前位置的⽅式在⽂件中的绝对位置读取或写⼊。
2024-01-25 15:39:50
1321
原创 Java NIO初体验
由于BIO(同步阻塞IO)对系统资源的浪费较大。Java1.4中引⼊了NIO框架,在java.nio包中提供了Channel、Selector、Buffer等抽象类,可以快速构建多路复⽤的IO程序,⽤于提供更接近操作系统底层的⾼性能数据操作⽅式。NIO(Non Blocking IO)是同步⾮阻塞的IO,服务器可以使⽤⼀个线程来处理多个客户端请求,客户端发送的请求会注册到多路复⽤器Selector上,由多路复⽤器Selector轮询各客户端的请求并进⾏处理。
2024-01-24 20:24:37
675
1
原创 Java BIO
Blocking IO也称为BIO,即同步阻塞IO。Java的io包基于流模型实现,提供了File、FileInputStream、FileOutputStream等输⼊输出流的功能。同样的,在java.net包下提供的部分⽹络API,如Socket、ServerSocket、HttpURLConnection等,进⾏⽹络通信时,也⽤到了java.io包下的流操作,因此也属于同步且阻塞的IO⾏为。
2024-01-24 13:54:24
1091
1
原创 SpringMVC拦截器
因为在源码中applyPreHandle()遍历时用的是i++,而applyPostHandle()和triggerAfterCompletion()中用的是i--,-- key设置要处理的异常,value设置出现该异常时要跳转的页面所对应的逻辑视图 -->-- key设置要处理的异常,value设置出现该异常时要跳转的页面所对应的逻辑视图 -->-- 配置需要拦截的请求的请求路径,/**表示所有请求 -->拦截器的preHandle()返回了false和它之前的拦截器都会执行 之后的不会执行。
2023-11-11 21:02:24
425
1
原创 SpringMVC文件上传和下载
/ 获取服务器中文件的真实路径 该文件在服务器中的路径。// 创建HttpHeaders对象设置响应头信息。// 创建filePath所对应的File对象。// 获取ServletContext对象。// 创建ResponseEntity对象。// 获取ServletContext对象。// 获取当前工程下的目标目录的真实路径。// 设置要下载方式以及下载文件的名字。// 判断file所对应的目录是否存在。-- 添加文件上传依赖 -->// 获取上传文件的文件名。// 设置响应状态码。
2023-11-10 17:56:18
194
原创 SpringMVC各种类型请求参数解析
从HandlerMapping中找到能处理请求的Handler (Controller.method())为当前Handler 找一个适配器 HandlerAdapter,RequestMappingHandlerAdapter0 - 支持方法上标注@RequestMapping 注解的适配器1 - 支持函数式编程的适配器....执行步骤。
2023-11-08 21:27:46
315
1
原创 Spring Boot请求映射处理
请求进来,先调用HttpServlet的doGet()方法,在doGet方法中会调用FrameworkServlet的processRequest(HttpServletRequest request, HttpServletResponse response)方法,在processRequest中调用DispatcherServlet的doService()方法,再调用doDispatch(每个请求都会调用)// 判断允许的请求方式中是否包含该请求方式。
2023-11-07 20:08:37
655
1
原创 SpringBoot静态资源处理
只要静态资源放在类路径下:called/static(or/public or/resources or /META-INF/resources)// WebProperties webProperties:获取和spring.resources绑定的所有的值的对象。// WebMvcProperties mvcProperties:获取和spring.mvc绑定的所有的值的对象。// 如果addMapping的值为false,所有的静态资源配置都失效。// 有参构造器的所有参数的值都会从容器中确定。
2023-11-06 21:07:16
222
1
原创 @SpringBootApplication自动配置原理
xxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties。这个方法会扫描当前包下所有的类,注册到容器中,由于@SpringApplication内有这个注解,所以现在扫描的也就是主启动类所在的。SpringBoot默认会在底层配置好所有的组件,但是如果用户配置了会以用户的优先。文件里面写死了 spring-boot 一启动就要给容器容器中加载的所有配置类。生效的配置类就会给容器中装配很多的组件。
2023-11-05 14:37:19
360
1
原创 代理模式以及AOP的五种通知
代理模式是常见的设计模式之一,顾名思义,代理模式就是代理对象具备真实对象的功能,并代替真实对象完成相应操作,并能够在操作执行的前后,对操作进行增强处理。System.out.println("LoggerAspect, 方法:" + joinPoint.getSignature() + ",结果:" + result);从静态代理的代码中可以看出,当实现类的方法越来越多的时候,这样构建方法的代码量是非常大的,所以我们就引进jdk动态代理(基于接口)。从每个方法中抽取出来的同一类非核心业务。
2023-11-04 09:48:19
318
1
原创 Bean的作用域以及自动装配
bean的后置处理器会在生命周期的初始化前后添加额外的操作,需要实现BeanPostProcessor接口,且配置到IOC容器中,需要注意的是,bean的后置处理器不是单独针对某一个bean生效,而是针对IOC容器中的所有bean都会执行。no,default:表示不装配,即bean 中的属性不会自动匹配某个bean为属性赋值,此时属性使用默认值。根据指定的策略,在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值。
2023-11-03 15:52:33
200
原创 IOC思想以及在Spring中的实现
在创建 bean 之前,首先需要创建 IOC 容器,将类的创建、销毁等过程交由 Spring 来实现,用户需要的时候就从 IOC 容器中取即可。反转了资源的获取方式——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器时如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本、提高了开发的效率。的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。在应用程序中的组件需要获取资源时,传统的方式是组件。
2023-10-30 17:10:36
246
1
原创 Spring 简介
Spring 时最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。Spring框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 年 6 月首次在 Apache2.0 许可下发布Spring 是轻量级的框架,其基础版本只有 2MB 左右的大小。
2023-10-29 19:09:15
118
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人