![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
源码学习
文章平均质量分 71
每天进步亿点点的小码农
Later equals never
展开
-
Spring源码学习笔记之@Async源码
最近工作中接触到了 Spring 的@Async注解,有了了解其使用方法和源码的想法,所以有了这篇文章,本文源码来自Spring6.1.10如果不配置自定义的线程池,Spring会默认获取类型的线程池,再获取不到,会获取名为的Executor类型的线程池,其实是由自动注入的,可以通过来更改其配置不论是方法一还是方法二都有一个弊端,那就是所有的异步任务都会使用同一个线程池,所以可以使用方法三来定义多个线程池,通过实例 Bean 的方式把Excutor注入 Spring,并指定 Bean 的名称。原创 2024-07-25 13:09:53 · 813 阅读 · 0 评论 -
EasyExcel的CellWriteHandler注入CellStyle不生效
类里发现确实有覆盖样式的操作,如下图:(ps:原本的2.2.7版本里是没有这个类的)方法,看这个方法名就能看出来,还要对 handler 进行排序和清理,再看下面。, 再排序清理一次,看到这里大概可以猜到了,估计我们自定义的。最近发现原本项目的导出excel功能中,写的那些。,经过排序清理之后,并不在最后,样式估计被后面的。,版本跨度比较大,所以怀疑是升级导致的问题。要解决问题,很简单,只要让我们自定义的。覆盖了,我们看下排序清理后的结果。,这3个逐个看了下源码,最终在。的源码,我们注册自定义的。原创 2024-05-17 18:53:26 · 841 阅读 · 0 评论 -
nacos配置自动刷新源码解析
最近好奇 nacos 是怎么做到配置自动刷新的,于是就去debug跟了下源码,版本是 nacos2.2.1客户端创建RpcClient与服务端建立连接时会添加Handler处理服务端推送的请求,并且启动一个线程不断去监听配置变化当服务端某配置文件里的配置发生变化时,发送通知给到客户端,告知其某配置文件变化客户端收到变更通知,立即把该配置文件内容发送到服务端去对比,服务端返回变化的配置文件然后客户端会再次请求服务端,获取最新的配置内容,覆盖客户端的最后销毁有注解的 bean,重新初始化。原创 2024-02-08 15:21:29 · 1117 阅读 · 0 评论 -
Spring中是否可以存在两个相同ID的bean
1、在解析xml文件时,会去校验同一个文件中不能存在相同 ID 的 bean,如果存在,会抛异常2、在解析@Bean注解时,会去校验同一个配置类中如果存在相同名称的 bean,如果存在,先注册的生效,后面的将不注册3、在扫描@Component注解时,会校验名称相同的两个bean中,前一个如果是扫描注册的,且和后一个不是同一个bean,就会抛异常4、前3个校验都是在真正注册之前校验的,如果都通过了,会在真正进行注册的地方通过参数来判断是覆盖还是抛异常。原创 2023-09-26 08:44:39 · 1068 阅读 · 0 评论 -
Gateway学习和源码解析
当我们的微服务越来越多,外部需要访问,为了安全,我们需要做身份认证,认证通过,才能访问我们的服务,而当请求过来,我们需要根据请求的不同,路由到不同的服务中,而一个服务会有多个实例,请求过来还需要做负载均衡,还有当请求过多的时候,我们需要做限流,以上这些都需要我们的网关来实现。目前网关有Zuul和Gateway,因为Zuul是阻塞式编程,而Gateway是基于的响应式编程,所以Gateway的吞吐会更好,下面我们就来学习Gateway!原创 2023-09-22 22:00:00 · 670 阅读 · 0 评论 -
十大排序算法及Java中的排序算法
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(n log n),因此称为非线性时间比较类排序线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序最后总结下 Tim Sort 的整体流程数组长度小于2,直接返回,小于32,使用二分插入排序根据数组长度算出run(连续递增或递减的子数组) 的最小长度minRun开始循环获取run,得到run的长度,如果递减的,将其翻转,如果run的长度小于。原创 2023-09-13 22:15:00 · 392 阅读 · 0 评论 -
SpringBoot读取配置文件顺序
本文通过源码分析 SpringBoot 加载配置文件目录的顺序,以及 properties、xml、yml、yaml文件的读取顺序。原创 2023-07-30 12:44:36 · 984 阅读 · 0 评论 -
FactoryBean源码解析
是 Spring 框架中的一个接口,用来创建特定类型的 Bean 对象。实现接口就可以自定义 Bean 对象的创建过程。本身也是 Bean,会在 Spring 中经历 Bean 的生命周期,而由创建的 Bean 不经历 Bean 的生命周期。原创 2023-07-19 18:20:01 · 1030 阅读 · 0 评论 -
Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析
Spring有两种类型的后置处理器,分别是和,这里再贴出我画的 Spring 启动过程,可以看看这两种后置处理器在 Spring 启动过程中位置。总结一下执行顺序先执行了的方法,按照顺序Ordered> 其他;再执行了的方法;最后执行的方法,按照顺序Ordered> 其他;原创 2023-07-06 21:00:00 · 9924 阅读 · 2 评论 -
@Import注解源码解析
本文将对 Spring 如何处理@Import注解的源码进行解析。原创 2023-07-03 23:15:00 · 257 阅读 · 0 评论 -
SpringBoot自动装配原理
Spring Boot 的自动装配(Auto-configuration)是 Spring Boot 框架中一项强大的功能,它可以根据应用程序的依赖和配置自动完成大部分常见的配置工作,减少了开发者在项目中进行繁琐的手动配置的工作。自动装配其实是通过条件化装配、自动配置类、配置属性绑定来实现的条件化装配:Spring Boot 使用条件化注解()来实现自动装配。这些注解基于运行时环境的条件来决定是否需要装配某个组件。自动配置类:Spring Boot 通过在 classpath 下的。原创 2023-06-27 22:40:35 · 5346 阅读 · 0 评论 -
OpenFeign源码学习
1、在SpringBoot项目启动阶段,扫描所有@FeignClient注解标注的接口,为其创建代理对象,把接口中的方法交由 FeignInvocationHandler 处理。2、当客户端调用该代理对象上的方法时,FeignInvocationHandler 会将方法调用转化为http请求,发送给服务端。原创 2023-06-21 23:30:00 · 856 阅读 · 0 评论 -
Mybatis插件原理
首先自定义插件要实现 Mybatis 的 Interceptor 接口,然后实现这个接口的3个方法,最后在类上打上 @Intercepts 注解,并用 @Signature 注解标注要拦截的接口名称、方法名称以及参数列表。我们用 Executor 来举例//增加自己的逻辑 log . info("执行器-------自定义处理逻辑");} }原创 2023-06-18 11:08:07 · 368 阅读 · 0 评论 -
Mybatis源码学习
本篇文章只是简单的带大家过一下整个Mybatis的流程,先有个初步的认识,后续有机会,再针对性的剖析细节。原创 2023-06-13 18:19:42 · 1277 阅读 · 0 评论 -
Java8新特性之——Optional类
Optional类是Java 8中引入的一个用于处理null值的容器类。它封装了某个类型的值,这个值可以是null,也可以是非null,通过它可以更优雅和简洁地处理包含null值的对象。Optional类的官方描述:翻译过来就是:一个可能包含null值的容器对象。如果值存在,isPresent()方法将会返回true,get()方法将会返回该值。原创 2023-04-09 17:30:00 · 2331 阅读 · 0 评论 -
Spring源码学习之RestTemplate
看完源码,我们知道,其实RestTemplate封装了原生的HttpURLConnection,采用Restful的理念,更优雅地来完成对HTTP服务的调用,那么什么是Restful风格,网上看到大神的回答用 URL 定位资源,用 HTTP 动词(GET,POST,DELETE,PUT)描述操作。用URL来指定具体的资源,如图片,文字,或者一个服务;用HTTP动词来描述操作;GET:请求服务器端已经存在的资源,通常将Query String查询条件以键值对的编码形式追加到URL中。原创 2023-04-01 09:17:22 · 424 阅读 · 0 评论 -
Spring源码解析之@PostConstruct注解
1、Spring启动,在registerBeanPostProcessors那一步,实例化并初始化了CommonAnnotationBeanPostProcessor这个BeanPostProcessor,并赋值initAnnotationType为PostConstruct.class;原创 2023-03-26 15:00:00 · 514 阅读 · 1 评论 -
SpringBoot项目启动卡死问题调查
发现key1会走第12行和第21行,在21行会调用Lambda表达式等待结果,这时候key2会进来,发现key1已经占住了位置,会走36行的else里,而key2不满足39行和61行的if条件,循环中没有可以跳出的地方,就陷入了死循环。后来我就好奇,为什么就会卡死了呢,为什么不报错,看栈信息,最后应该是卡死在了ConcurrentHashMap的computeIfAbsent方法上,于是就去跟了下源码,找到了调用computeIfAbsent方法的地方,是ConcurrentMapCache的get方法。原创 2023-03-11 16:56:48 · 3505 阅读 · 4 评论 -
SpringBoot扩展点之ApplicationRunner与CommandLineRunner
在我们的日常开发中会有这样的场景,在容器启动完成之后去做一些事,例如:数据库初始化、缓存预热、启动后检查、任务调度等。SpringBoot给我们提供了两个接口来帮助我们实现这种需求,分别是:ApplicationRunner和 CommandLineRunner。这两个接口的主要区别是参数传递方式不同。ApplicationRunner接口的run()方法有一个ApplicationArguments类型的参数,CommandLineRunner接口的run()方法有一个String数组类型的参数。原创 2023-03-04 09:57:28 · 273 阅读 · 0 评论 -
@ControllerAdvice注解作用及源码解析
1、@ExceptionHandler注解标注的方法:用于捕获Controller中抛出的不同类型的异常,从而达到异常全局处理的目的;2、@ModelAttribute注解标注的方法:表示此方法会在执行目标Controller方法之前执行;3、@InitBinder注解标注的方法:用于请求中注册自定义参数的解析,从而达到自定义请求参数格式的目的;在我们日常的开发过程中,通常会根据业务定义属于自己的异常,所以通过定制自己的异常处理器,来处理项目中大大小小、各种各样的异常。原创 2023-03-02 18:09:29 · 6526 阅读 · 0 评论 -
SpringMVC源码学习笔记之请求处理流程
核心逻辑是第6行的getHandlerInternal,getHandlerInternal是个模板方法,最终会调用子类实现,这里有两个重要的实现类,分别是AbstractHandlerMethodMapping和AbstractUrlHandlerMapping,上面我们提到HandlerMapper有两个非常主要的实现类:RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,我们看看这两个类的类图。原创 2023-02-18 11:20:30 · 394 阅读 · 0 评论 -
SpringMVC源码学习笔记之DispatcherServlet
在整个SpringMVC框架中,DispatcherServlet处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作。DispatcherServlet是SpringMVC统一的入口,所有的请求都通过它。我们先看下DispatcherServlet的类图可以看到DispatcherServlet本质上是一个Servlet,而我们知道Servlet的生命周期是init -> service -> destroy,下面我们看看DispatcherServlet的初始化过程,也就是init方法。原创 2023-02-18 11:07:09 · 126 阅读 · 0 评论 -
Spring源码学习笔记之AOP源码
Spring中的AOP其实是通过动态代理来实现的,在bean的后置处理时,通过AnnotationAwareAspectJAutoProxyCreator这个后置处理器来生成代理类1、在容器刷新过程中的invokeBeanFactoryPostProcessors方法里把AnnotationAwareAspectJAutoProxyCreator注册到beanDefinitionMap里;2、在容器刷新过程中的registerBeanPostProcessors方法里完成了初始化;原创 2023-02-18 10:45:14 · 128 阅读 · 0 评论 -
Spring源码学习笔记(十三)、finishRefresh
/ 最后一步,完成刷新最后一步,完成刷新清理缓存资源初始化lifecycleProcessor,默认是DefaultLifecycleProcessor触发DefaultLifecycleProcessor的onRefresh方法发布事件ContextRefreshedEvent注册ApplicationContext到LiveBeansView内部的applicationContexts中。原创 2023-02-11 18:46:05 · 122 阅读 · 0 评论 -
Spring源码学习笔记(十二)、finishBeanFactoryInitialization
/ 初始化所有的singleton beans(lazy-init的除外)初始化所有的singleton beans(lazy-init的除外)原创 2023-02-10 10:28:05 · 374 阅读 · 0 评论 -
Spring源码学习笔记(十一)、registerListeners
/ 注册监听器注册监听器获取所有的监听器,并绑定到广播器获取监听器的名称,绑定到广播器如果存在早期应用事件,直接广播出去。原创 2023-02-10 10:24:42 · 99 阅读 · 0 评论 -
Spring源码学习笔记(十)、onRefresh
/ 初始化特定上下文子类中的其他特殊bean。初始化特定上下文子类中的其他特殊bean。这是个模板方法,实现是空的,交由子类实现,我们看下其子类ServletWebServerApplicationContext的实现,借此可以看看Springboot项目是如何自动启动tomcat的。原创 2023-02-10 10:21:46 · 144 阅读 · 0 评论 -
Spring源码学习笔记(九)、initApplicationEventMulticaster
/ 初始化事件多播器初始化事件多播器。原创 2023-02-10 10:09:50 · 161 阅读 · 0 评论 -
Spring源码学习笔记(八)、initMessageSource
/ 加载messageSource,加载messageSource, messageSource是用来处理国际化的。原创 2023-02-10 10:03:06 · 171 阅读 · 0 评论 -
Spring源码学习笔记(七)、registerBeanPostProcessors
/ 注册拦截bean创建的bean处理器。注册拦截bean创建的bean处理器。在bean实例化前注册并实例化所有的BeanPostProcessor。原创 2023-02-10 09:52:05 · 131 阅读 · 0 评论 -
Spring源码学习笔记(六)、invokeBeanFactoryPostProcessors
/ 调用注册的BeanFactory的后置处理器调用注册的BeanFactory的后置处理器。原创 2023-02-10 09:46:54 · 99 阅读 · 0 评论 -
Spring源码学习笔记(五)、postProcessBeanFactory
/ 允许在上下文子类中对bean工厂进行后处理, 相当于beanFactory的后置处理器Spring中并没有具体去实现postProcessBeanFactory方法,相当于定义了一个模板方法,提供给想要实现BeanPostProcessor的三方框架使用的。谁要使用谁就去实现。作用是在BeanFactory准备工作完成后做一些定制化的处理,一般结合BeanPostProcessor接口的实现类一起使用,注入一些重要资源(类似Application的属性和ServletContext的属性)。原创 2023-02-10 09:43:24 · 372 阅读 · 0 评论 -
Spring源码学习笔记(四)、prepareBeanFactory
/ 准备bean工厂,初始化bean工厂,给bean工厂设置属性值准备bean工厂,初始化bean工厂,给bean工厂设置属性值,主要包含如下的操作:设置BeanFactory的类加载器设置BeanExpressionResolver添加ResourceEditorRegistrar添加ApplicationContextAwareProcessor忽略一些依赖接口设置几个自动装配的特殊规则添加ApplicationListenerDetector增加对AspectJ的支持。原创 2023-02-10 09:38:35 · 129 阅读 · 0 评论 -
Spring源码学习笔记(三)、obtainFreshBeanFactory
/ 告诉子类刷新内部bean工厂获得一个刷新后的bean工厂,返回一个ConfigurableListableBeanFactory对象,主要包含如下的操作:如果bean工厂了,就销毁掉,关闭掉创建一个新的bean工厂设置序列化id和两个属性加载BeanDefinition(解析xml中的bean,封装成BeanDefinition,放置到beanDefinition的map中)(重点!!!原创 2023-02-10 09:29:49 · 162 阅读 · 0 评论 -
Spring源码学习笔记(二)、prepareRefresh
/ 准备刷新该方法就想它的名字一样,在正式的刷新之前做一些准备工作,主要包含如下的操作:记录开始时间设置closed、active标识记录日志初始化属性资源创建环境对象校验必要的属性初始化earlyApplicationEvents。原创 2023-02-09 17:26:36 · 130 阅读 · 0 评论 -
Spring源码学习笔记(一)、refresh
之后会对其中的12个方法逐个深入了解。原创 2023-02-09 16:13:39 · 86 阅读 · 0 评论 -
HashMap源码解析(JDK1.8)
HashMap源码解析(JDK1.8)原创 2023-01-19 10:39:37 · 120 阅读 · 1 评论