自动配置原理
自动配置原理Auto-Configuration
它是基于你引入的依赖jar包,对SpringBoot应用进行自动配置
他为SpringBoot框架的“开箱即用”提供了基础支撑
术语“配置类”,英文Configuration Class:
广义的“配置类”:被注解@Component直接或间接修饰的某个类,即我们常说的Spring组件,其中包括了@Configuration类
狭义的“配置类”:特指被注解@Configuration所修饰的某个类,又称为@Configuration类
相关注解@ComponentScan
@ComponentScan,是来自Spring框架的一个注解:
它的作用对指定的package进行扫描,找到其中复合条件的类,默认是搜索被注解@Component修饰的配置类
通过属性basePackages或basePackageClasses,来指定要进行扫描的package
如果未指定package,则默认扫描当前@ComponentScan所修饰的类所在的package
@Import
是来自Spring框架的一个注解:
它的作用是提供了一种显 ...
垃圾清除算法
当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用内存空间为新对象分配
目前在JVM中比较常见的三种垃圾收集算法是标记-清除算法(Mark-Swap)、复制算法(Copying)、标记-压缩算法(Mark-Compact)
标记-清除算法标记-清除算法是一种非常基础和常见的垃圾收集算法
执行过程
当堆中的有效内存空间(available memory)被耗尽的时候,就会停止整个程序(也被称为stop the world),然后进行两项工作,第一项则是标记,第二项则是清除
标记:Collector从引用根节点开始遍历,标记所有被引用的对象。一般是在对象的Header中记录可达对象
清除:Collector对堆内存从头到尾进行线性的遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其回收
缺点
效率不算高
在进行GC的时候,需要停止整个应用程序,导致用户体验差
这种方式清理出来的空闲内存是不连续的,产生内存碎片。需要维护一个空闲列表
何为清除?
这里所谓的清除并不是真的置空,而是把需要清除的 ...
垃圾回收
基本概述什么是垃圾
垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾
如果不及时对内存中的垃圾进行处理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出
为什么需要GC
对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样
除了释放没用的对象,垃圾回收也可以清楚内存里的记录碎片。碎片整理将所占用的堆内存移动到堆的一端,以便JVM将整理出来的内存分配给新的对象
随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常运行。而经常造成的STW的GC又跟不上实际需求,所以才会不断尝试对GC进行优化
早期的垃圾回收
在早期的C/C++时代,垃圾回收基本上是手工进行的。开发人员可以使用new关键字进行内存申请,并使用delete关键字进行内存释放
这种方法可以灵活控制内存释放的时间,但是会给开发人员带来频繁申请和内存的管理负担。倘若有一处内存区间由程序员编码的问题 ...
Redis缓存问题
缓存穿透当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题。
缓存穿透的发生一般有这两种情况:
业务误操作,缓存中的数据和数据库中的数据都被误删除了,所以导致缓存和数据库中都没有数据;
黑客恶意攻击,故意大量访问某些读取不存在数据的业务;
常见解决方案应对缓存穿透的方案,常见的方案有三种。
第一种方案,非法请求的限制;
第二种方案,缓存空值或者默认值;
第三种方案,使用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在;
非法请求限制当有大量恶意请求访问不存在的数据的时候,也会发生缓存穿透,因此在 API 入口处我们要判断求请求参数是否合理,请求参数是否含有非法值、请求字段是否存在,如果判断出是恶意请求就直接返回错误,避免进一步访问缓存和数据库。
缓存空值或者默认值当我们线上业务发现缓存穿透的现象时,可以针对查询的数据,在缓存中设置一个空值或者默认值,这样后续请求就可以从缓 ...
责任链模式
责任链模式1. 什么是责任链责任链设计模式是一种行为型设计模式,其主要目的是解耦请求发送者和请求接收者,让多个对象都有机会处理请求,从而避免请求发送者和接收者之间的紧耦合。
责任链模式的核心是一个链式结构,链中每个节点代表一个处理者对象,请求先经过第一个节点处理,如果该节点能够处理请求,则直接返回处理结果;否则,请求继续往下一个节点传递,直到找到能够处理该请求的节点为止。整个过程类似于流水线上的多个工作站,每个工作站负责一项工作,如果自己处理不了,就将工作交给下一个工作站,直到整个工作完成。
在责任链模式中,每个处理者对象都有一个指向下一个处理者对象的引用,这样就形成了一个处理者链。请求发送者只需要将请求发送给第一个节点即可,而不用关心请求会被哪个处理者对象处理。由于每个处理者对象都有机会处理请求,因此责任链模式可以实现请求的动态分配。
2. 优缺点责任链模式的优点在于,它可以动态地添加、删除和调整处理者对象,从而灵活地构建处理链。同时,它也避免了请求发送者和接收者之间的紧耦合,增强了系统的灵活性和可扩展性。
不过,责任链模式也有一定的缺点,例如如果处理链过长或者处理时间过长,可能会对 ...
策略模式
日常 Coding 过程中,设计模式三板斧:模版、构建者、策略,今天来说下第三板斧 策略设计模式。
策略模式还是比较简单并且使用较多的,平常我们多运用策略模式用来消除 if-else、switch 等多重判断的代码,消除 if-else、switch 多重判断 可以有效应对代码的复杂性。
如果分支判断会不断变化(增、删、改),那么可以使用别的技巧让其满足开闭原则,提高代码的扩展性 (策略模式场景主要负责解耦,开闭原则需要额外支持)。
下文中会详细列举如何使用设计模式做个 Demo 、模式的真实场景以及策略模式的好处。
什么是策略模式策略模式在 GoF 的《设计模式》一书中,是这样定义的:
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
定义一组算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式使这些算法在客户端调用 ...
Integer
IntegerInteger.valueOf()源码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 @IntrinsicCandidate public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }//缓存-128-127区间的数值private static class IntegerCache { static final int low = -128; static final int high; static final ...
分层结构
体系结构&参考模型分层结构为什么要分层
发送通信的计算机必须要将数据通信的通路进行激活
要告诉网络如何识别目的主机
发送通信的计算机要查明目的主机是否开机,并且与网络连接正常
发起通信的计算机要弄清楚,对方计算机中文件管理程序是否已经做好准备工作
确保差错和意外可以解决
怎么分层
各层之间相互独立,每层只实现一种相对独立的功能
各层之间界面自然清晰,易于理解,相互交流尽可能少
结构上可分割开。每层都采用最适合的技术来实现。
保持下层对上层的独立性,上层单项使用下层提供的服务
整个分层结构能够促进标准化工作
对等实体之间才有协议
认识分层机构
实体:第n层中的活动元素称为n层实体。同一层的实体叫做对等实体
协议:为进行网络中的对等实体数据交换而建立的规则、标准或约定称为网络协议。(水平)
接口(访问服务点SAP):上层使用下层服务的入口。
服务:下层为相邻上层提供的功能调用(垂直)。
SDU服务数据单元:为用户所要求的功能而传送的数据
PCI协议控制信息:控制协议操作的信息。
PDU协议数据单元:对等层次传送的数据单元。
概念总结
网络体系结构是从功能上描述叫算计网络结构
...
Spring容器
容器的实现Spring的IoC容器就是IoC思想的一个落地的产品实现。IoC容器中管理的组件也叫bean。创建bean之前,首先需要创建IoC容器。Spring提供了IoC容器的两种实现方式:
这是IoC容器的基本实现,是Spring内部使用的接口。面向Spring本身,不提供给开发人员使用
ApplicationContext
BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory
ApplicationContext的实现主要类
BeanFactory使用BeanFactory
1234567891011public class DiTest { public static void main(String[] args) { DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinition ...