自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(140)
  • 资源 (3)
  • 收藏
  • 关注

原创 源码解读系列-SpringBoot源码(四)- Run方法执行流程(二)

在上面createApplicationContext()方法中的, BeanUtils.instantiateClass(contextClass) 这个方法中,不但初始化了AnnotationConfigServletWebServerApplicationContext类,也就是我们的上下文context,同样也触发了GenericApplicationContext类的构造函数,从而beanFactory(IOC容器)也创建了。后面马上就到最最最重要的refresh()方法了。

2024-05-17 22:30:29 971

原创 源码解读系列-SpringBoot源码(三)- Run方法执行流程(一)

关于 SpringApplication 类的构造过程,到这里我们就梳理完了。纵观 SpringApplication 类的实例化过程,我们可以看到,合理的利用该类,我们能在spring容器创建之前做一些预备工作,和定制化的需求。比如,自定义SpringBoot的Banner,比如自定义事件监听器,再比如在容器refresh之前通过自定义 ApplicationContextInitializer 修改配置一些配置或者获取指定的bean都是可以的。

2024-05-16 21:58:14 781

原创 源码解读系列-SpringBoot源码(二)- 自动配置

自动配置:根据我们添加的jar包依赖,会自动将一些配置类的bean注册进ioc容器,我们可以需要的地方使用@Autowired或者@Resource等注解来使用它。问题:Spring Boot到底是如何进行自动配置的,都把哪些组件进行了自动配置?Spring Boot应用的启动入口是@SpringBootApplication注解标注类中的main()方法,:应用标注在某个类上说明这个类是的主配置类,就应该运行这个类的方法启动应用。下面,查看@SpringBootApplication内部源码进行分析 ,核

2024-05-16 21:44:46 1091

原创 源码解读系列-SpringBoot源码(一)- 源码环境搭建及依赖管理

为了充分利用Spring Boot框架的优势,在Spring Boot官方没有整合这些技术框架的情况下,Druid等技术框架所在的开发团队主动与Spring Boot框架进行了整合,实现了各自的依赖启动器,例如druid-spring-boot-starter等。在Spring Boot入门程序中,项目pom.xml文件有两个核心依赖,分别是spring-boot-starter-parent和spring-boot-starter-web,关于这两个依赖的相关介绍具体如下。

2024-05-13 08:00:00 905

原创 源码解读系列-spring源码(二十一)- mvc视图解析渲染

FactoryBean,以Bean结尾,表示它是一个Bean,一般情况下,Spring通过反射机制利用的class属性指定实现类实例化Bean,在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。该方法的核心是render方法,用来解析并呈现视图和模型。BeanFactory,以Factory结尾,表示它是一个工厂类(接口), 它负责生产和管理bean的一个工厂(IOC容器),在Spring中,

2024-05-13 07:45:00 759

原创 源码解读系列-spring源码(二十)- MVC HandlerAdapter handle 方法解析

继续分析,接下来应该调用Controller中的具体方法了,但是在调用之前,还要有参数解析、InitBinder方法初始化、InitBinder方法调用等工作,接下来逐步分析。的异常,如果类上标注了@SessionAttributes注解,且在方法中标注了@ModelAttribute注解,如果@ModelAttribute为空,则会抛出此异常。到这里invokeAndHandle方法的调用就完成了,接下来是getModelAndViewd对返回的模型做了进一步的处理。

2024-05-13 07:30:00 864

原创 源码解读系列-spring源码(十九)- MVC 获取handler及HandlerAdapter

Spring会循环所有注册的HandlerMapping并返回第一个匹配的HandlerExecutionChain的。其中handler即Controller本身实例,HandlerInterceptor是一个拦截器,其可以在SpringMVC的请求过过程中在不同的时机回调不同的接口。将上一步获取到的handler转化为HandlerExecutionChain对象,并循环所有注册的HandlerInterceptor并将其加入到HandlerExecutionChain链中。

2024-05-12 22:53:19 292

原创 源码解读系列-spring源码(十八)- MVC注解

标签默认会开启SpringMVC的注解驱动模式,默认注册一个RequestMappingHandlerMapping、一个RequestMappingHandlerAdapter、一个ExceptionHandlerExceptionResolver。以支持对使用了 @RequestMapping 、 @ExceptionHandler 及其他注解的控制器方法的请求处理。

2024-05-12 22:38:51 242

原创 源码解读系列-spring源码(十七)- MVC子容器&9大组件

类的子IoC容器创建过程,如果当前Servlet存在一个IoC容器则为其设置根IoC容器作为其父类,并配置刷新该容器,用于构造其定义的Bean,这里的方法与前文讲述的根IoC容器类似,同样会读取用户在web.xml中配置的中的值,用于查找相关的xml配置文件用于构造定义的Bean,这里不再赘述了。答:父子容器类似于类的继承关系,子类可以访问父类中的成员变量,而父类不可访问子类的成员变量,同样的,子容器可以访问父容器中定义的Bean,但父容器无法访问子容器定义的Bean。首先像容器注册一个自定义的。

2024-05-12 20:58:52 909

原创 源码解读系列-spring源码(十六)- MVC源码环境及父容器

很简单,通过上面的操作,我们就可以确定contextClassName是XmlWebApplicationContext,跟我们之前分析的ApplicationContext差不多,只是在其基础上又提供了对web的支持。时会使用到这个全局变量,因此,Web应用在容器中部署后,进行初始化时会先读取这个全局变量,之后再进行上述讲解的初始化启动过程。红色框是 Servlet 中的接口和类,蓝色框中则是 Spring 中的接口和类。,这里采用的是观察者模式,也称为为订阅-发布模式,实现了该接口的。

2024-05-11 23:36:54 975

原创 源码解读系列-spring源码(十五)- AOP 一次请求调用全流程

AspectJ 方式的 AOP 内容到此就介绍完毕了,核心流程如下。1)解析 AOP 的注解,并注册对应的内部管理的自动代理创建者的 bean,对于本次介绍是:AnnotationAwareAspectJAutoProxyCreator,其他的还有 InfrastructureAdvisorAutoProxyCreator 和 AspectJAwareAdvisorAutoProxyCreator。

2024-05-11 23:22:52 601

原创 源码解读系列-spring源码(十四)- 创建 AOP 代理的解析II

至此,创建 AOP 代理对象完成。

2024-05-11 23:18:08 712

原创 源码解读系列-spring源码(十三)- 创建 AOP 代理的解析I

null) {// 1.判断当前bean是否需要被代理,如果需要则进行封装if (!1.判断当前bean是否需要被代理,如果需要则进行封装,见代码块1。

2024-05-11 23:13:57 293 1

原创 源码解读系列-spring源码(十二)- AOP机制及注解的解析

AOP(Aspect Orient Programming):面向切面编程;用途:用于系统中的横切关注点,比如日志管理,事务管理;实现:利用代理模式,通过代理对象对被代理的对象增加功能。所以,关键在于AOP框架自动创建AOP代理对象,代理模式分为静态代理和动态代理;框架: AspectJ使用静态代理,编译时增强,在编译期生成代理对象;SpringAOP使用动态代理,运行时增强,在运行时,动态生成代理对象;

2024-05-11 23:04:09 745

原创 源码解读系列-spring源码(十一)- 循环依赖

循环依赖:一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用(闭环)。例:第一种情况:两个对象之间的直接依赖:第二种情况:多个对象之间的间接依赖注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。

2024-05-11 22:50:18 744 1

原创 源码解读系列-spring源码(十)

将之前解析的 BeanDefinition 进一步处理,将有父 BeanDefinition 的进行合并,获得 MergedBeanDefinition尝试从缓存获取 bean 实例处理特殊的 bean —— FactoryBean 的创建创建 bean 实例循环引用的处理bean 实例属性填充bean 实例的初始化BeanPostProcessor 的各种扩展应用。

2024-05-11 22:29:59 686

原创 源码解读系列-spring源码(八)

finishBeanFactoryInitialization 是整个 Spring IoC 核心中的核心。该方法会实例化所有剩余的非懒加载单例 bean。除了一些内部的 bean、实现了 BeanFactoryPostProcessor 接口的 bean、实现了 BeanPostProcessor 接口的 bean,其他的非懒加载单例 bean 都会在这个方法中被实例化,并且 BeanPostProcessor 的触发也是在这个方法中。

2024-05-09 19:33:40 687

原创 源码解读系列-spring源码(九)

解决循环引用逻辑:使用构造函数创建一个 “不完整” 的 bean 实例(之所以说不完整,是因为此时该 bean 实例还未初始化),并且提前曝光该 bean 实例的 ObjectFactory(提前曝光就是将 ObjectFactory 放到 singletonFactories 缓存),通过 ObjectFactory 我们可以拿到该 bean 实例的引用,如果出现循环引用,我们可以通过缓存中的 ObjectFactory 来拿到 bean 实例,从而避免出现循环引用导致的死循环。

2024-05-09 19:33:17 921

原创 源码解读系列-spring源码(七)

initMessageSource()方法用来设置国际化资源相关的调用,将实现了MessageSource接口的bean存放在ApplicationContext的成员变量中,先看是否有此配置,如果有就实例化,否则就创建一个DelegatingMessageSource实例的bean初始化MessageSource组件(做国际化功能;消息绑定,消息解析);获取BeanFactory判断容器中是否有id为messageSource的,类型是MessageSource的组件;

2024-05-09 16:13:07 573

原创 源码解读系列-spring源码(六)

1.整个 registerBeanPostProcessors 方法围绕 BeanPostProcessor 接口展开, 将 BeanPostProcessor 实现类注册到 BeanFactory 的 beanPostProcessors 缓存中(注意:只注册,不调用,还未到调用时机)2.BeanPostProcessor 实现类具体的 “出场时机” 在创建 bean 实例时,执行初始化方法前后。

2024-05-09 15:34:28 475

原创 源码解读系列-spring源码(五)

配置 beanFactory 的标准上下文特征,例如上下文的 ClassLoader、后置处理器等。这个方法会注册3个默认环境 bean:environment、systemProperties 和 systemEnvironment,注册 2 个 bean 后置处理器:ApplicationContextAwareProcessor 和 ApplicationListenerDetector。

2024-05-09 15:29:07 776

原创 源码解读系列-spring源码(四)

到这里已经初始化了 Bean 容器,<bean />配置也相应的转换为了一个个 BeanDefinition,然后注册了各个 BeanDefinition 到注册中心,并且发送了注册事件首先,将 xml 中的 bean 配置信息进行了解析,并构建了 AbstractBeanDefinition(GenericBeanDefinition) 对象来存放所有解析出来的属性。

2024-05-08 18:56:33 910

原创 源码解读系列-spring源码(三)

为刷新准备新的上下文环境,设置其启动日期和活动标志以及执行一些属性的初始化。主要是一些准备工作(不是很重要的方法)作用:用于获得一个新的 BeanFactory流程:该方法会解析所有 Spring 配置文件(通常我们会放在 resources 目录下),将所有 Spring 配置文件中的 bean 定义封装成 BeanDefinition,加载到 BeanFactory 中(只注册,不会进行Bean的实例化)。

2024-05-08 18:56:15 849

原创 源码解读系列-spring源码(二)

Gradle是一个项目自动化构建工具。是Apache的一个基于Ant 和Maven的软件,用于项目的依赖管理。

2024-05-08 10:57:59 331

原创 源码解读系列-spring源码(一)

Bean组件定义在Spring的包下,解决了以下几个问题:Bean的定义Bean的创建Bean的解析Spring Bean的创建是典型的工厂模式,它的顶级接口是BeanFactory。BeanFactory有三个子类:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。目的是为了区分Spring内部对象处理和转化的数据限制。

2024-05-08 10:48:52 655

原创 应用级算法系列(七)- 一致性hash及其应用

分散性(Spread):分布式环境中,客户端请求时可能只知道其中一部分服务器,那么两个客户端看到不同的部分,并且认为自己看到的都是完整的hash环,那么问题来了,相同的key可能被路由到不同服务器上去。查找过程如下:首先把text按字拆分,逐个字查找词库的key,先从“讨”开始,没有就下一个字“厌”,直到“广”,找到就判断isEnd,如果为1,说明匹配成功包含敏感词,如果为0,那就继续匹配“告”,直到isEnd=1为止。因为我们需要的是前k名,那至于这k个,谁大谁小并不需要关心,排序依然是个浪费。

2024-04-30 21:02:02 547

原创 应用级算法系列(六)-加密算法的应用

使用其中一个加密后,则原始明文只能用对应的另一个密钥解密,即使最初用于加密的密钥也不能用作解密。例如从某站下载的文件(尤其是大文件,比如系统镜像iso),官方网站都会放置一个签名(可能是MD5,或者SHA),当用户拿到文件后,可以本地执行散列算法与官网签名比对是否一致,来判断文件是否被篡改。DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等。

2024-04-30 20:56:11 580

原创 应用级算法系列(五)-负载均衡算法

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。既然涉及到多个机器,就涉及到任务如何分发,这就是负载均衡算法问题。

2024-04-30 20:51:11 948

原创 应用级算法系列(四)-定时算法与应用

系统或者项目中难免会遇到各种需要自动去执行的任务,实现这些任务的手段也多种多样,如操作系统的crontab,spring框架的quartz,java的Timer和ScheduledThreadPool都是定时任务中的典型手段。

2024-04-30 20:45:31 390

原创 应用级算法系列(三)-调度算法及应用

调度算法常见于操作系统中,因为系统资源有限,当有多个进程(或多个进程发出的请求)要使用这些资源时,就必须按照一定的原则选择进程(请求)来占用资源。这就是所谓的调度。在现实生活中也是一样,比如会议室的占用。

2024-04-30 20:41:47 699

原创 应用级算法系列(二)-限流算法及应用

限流是对系统的一种保护措施。即限制流量请求的频率(每秒处理多少个请求)。一般来说,当请求流量超过系统的瓶颈,则丢弃掉多余的请求流量,保证系统的可用性。即要么不放进来,放进来的就保证提供服务。

2024-04-30 17:38:56 417

原创 应用级算法系列(一)-概论及失效算法

基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题小到可以简单的直接求解,原问题的解即子问题的解的合并。算法指的是基于存储结构下,对数据如何有效的操作,采用什么方式可以更有效的处理数据,提高数据运算效率。在特定环境下的业务,还需要综合考虑算法的各项性能,如使用频率,数据量的大小,所用的开发语言,运行的机器系统等。

2024-04-30 17:28:48 436

原创 架构师系列-并发编程(六)-ThreadLocal

ThreadLocal对象只是作为ThreadLocalMap的一个key而存在的,现在它被回收了,那么value呢?针对这一问题,ThreadLocalMap类在每次get(),set(),remove() ThreadLocalMap中的值的时候,会自动清理key为null的value。在上述的get方法中,Entry类继承了WeakReference,即每个Entry对象都有一个ThreadLocal的弱引用,GC对于弱引用的对象采取积极的内存回收策略,避免无人搭理时发生内存泄露。

2024-04-30 17:02:15 477 1

原创 架构师系列-并发编程(五)-线程的三大特性

通过前面我们知道发生原子性的根源是CPU在执行完任意指令后都有可能发生线程切换。如果能够禁用线程切换的话那这个问题也就迎刃而解了。操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换。知识点:CPU中断让CPU停下当前的工作任务,去处理其他事情,处理完后回来继续执行刚才的任务,这一过程便是中断。一文讲透计算机的“中断” - 知乎当然这种方案在单核CPU是可行的,但是在多核CPU中就不行了,为什么?我们来分析一下。

2024-04-30 15:35:36 252

原创 架构师系列-并发编程(四)-基本协同

结果分析:wait让出锁,t3得到执行,t3唤醒后,虽然t1先start,但是优先级低,所以t2优先执行(注意是概率,不是绝对的!2)yield:不释放锁,运行中转为就绪,让出cpu给大家去竞争。t3会插队抢到执行权,但是t2不会,因为t2和t1共用一把锁而yield不会释放。3)join:父线程等待子线程执行完成后再执行,将异步转为同步。1)sleep:暂停一下,只是让出CPU的执行权,并不释放锁。新的thread无法异步执行,被迫等待锁,跟着sleep。注意调起的是子线程,阻断的是父线程。

2024-04-30 12:56:54 172

原创 架构师系列-并发编程(三)-AQS

如果要想真正的理解JUC下的并发工具的实现原理,我们必须要来学习AQS,因为它是JUC下很多类的基石。在讲解AQS之前,如果老板让你自己写一个SDK层面的锁,给其他同事去使用,你会如何写呢?1、搞一个状态标记,用来表示持有或未持有锁,但得是volatile类型的保证线程可见性。2、编写一个lockunlock函数用于抢锁和释放锁,就是对状态标记的修改操作3、lock函数要保证并发下只能有一个线程能抢到锁,其他线程要等待获取锁(阻塞式),可以采用CAS+自旋的方式实现。

2024-04-30 11:23:00 982

原创 架构师系列-并发编程(二)-Fork/Join及原子操作

ForkJoinPool也类似,线程集合里放的是特殊线程ForkJoinWorkerThread,任务队列里放的是特殊任务ForkJoinTask。1.任务分割:Fork(分岔),先把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割。2.合并结果:join,分割后的子任务被多个线程执行后,再合并结果,得到最终的完整输出。在fork的时候,也就是任务拆分,将拆分的task会被当前线程放到自己的队列中。普通线程池内部有两个重要集合:工作线程集合(普通线程),和任务队列。

2024-04-30 08:00:00 568

原创 架构师系列-并发编程(一)-线程池

验证:看源码,每个work在runWork()的时候去getTask(),在getTask内部,并没有针对性的区分当前work是否是核心线程或者类似的标记。答案:如果队列中没有任务时,核心线程会一直阻塞在获取任务的方法,直到返回任务。Java 提供的线程池相关的工具类中,最核心的是 ThreadPoolExecutor,我们首先来看它的类体系及构造。2:核心线程会一直存活,即使没有任务需要执行,当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理。线程池会创建新线程来处理任务。

2024-04-29 22:15:53 1144

原创 架构师系列-并发框架Disruptor(三)- 高级使用

当某个位置写入成功的时候,便把availble Buffer相应的位置置位,标记为写入成功。在多生产者中,每个生产者首先通过CAS竞争获取可以写的空间,然后再进行慢慢往里放数据,如果正好这个时候消费者要消费数据,那么每个消费者都需要获取最大可消费的下标,这个下标是在AvailableBuffer进行获取得到的最长连续的序列下标。假设三个生产者在写中,还没有置位AvailableBuffer,那么消费者可获取的消费下标只能获取到6,然后等生产者都写OK后,通知到消费者,消费者继续重复上面的步骤。

2024-04-28 12:36:10 709

原创 架构师系列-并发框架Disruptor(二)- 高性能原理

为了解决计算机系统中主内存与 CPU 之间运行速度差问题,会在 CPU 与主内存之间 添加一级或者多级高速缓冲存储器( Cache),这个 Cache 一般是被集成到 CPU 内部的, 所以也叫 CPU Cache,如图所示是两级 Cache 结构。Cache内部是按行存储的,其中每一行称为一个cache line,由很多个 Cache line 组成的,Cache line 是 cache 和 RAM 交换数据的最小单位,cache行的大小一般为2的幂次数字节,通常为 64 Byte。

2024-04-28 12:35:40 971

settings.zip

idea设置eclipse代码风格

2021-05-16

docker-18.03.1.zip

docker离线安装包,解压后,即可使用,无需在线安装第三方包或者插件。 该安装包可配合我的博客进行学习

2020-04-30

空空如也

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

TA关注的人

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