- 博客(27)
- 收藏
- 关注
原创 Spring原理分析--获取Environment资源对象
PropertySourceLoader接口的实现类有PropertiesPropertySourceLoader和YamlPropertySourceLoader,其中PropertiesPropertySourceLoader可以加载properties和xml格式的配置文件,YamlPropertySourceLoader可以加载yml及yaml格式的配置文件。
2024-05-07 19:34:47 1372
原创 Spring原理分析--获取Resource资源对象
ClassLoader的getResources方法中会递归查找父类加载器加载的资源,返回CompoundEnumeration对象是一个嵌套的迭代器,内部还封装了Enumeration迭代器,因此父类查找到的资源会放入内部的迭代器中,层层嵌套。通过getResources获取到资源文件后,就可以使用Resource对象中的方法进行文件操作,例如获取输入流、判断资源是否存在、获取资源的文件名等。2)findAllClassPathResources处理Classpath:*下的不带通配符路径。
2024-04-19 19:26:38 403
原创 Spring原理分析--@Primary注解
SpringBoot启动时,在refresh方法中会调用invokeBeanFactoryPostProcessors扩展BeanDefinition,其中会调用到ConfigurationClassPostProcessor的processConfigBeanDefinitions,processConfigBeanDefinitions中会根据不同的情况扫描要注册的bean,源码loadBeanDefinitionsForConfigurationClass如下。
2024-04-18 19:35:59 870
原创 Spring原理分析--国际化
最终调用的ResourceBundle是JDK中提供的类,用于处理国际化资源,ResourceBundle通过加载不同的messages_xx属性文件来实现国际化,每个属性文件对应一种语言版本,如果没有找到对应的属性文件,默认会使用本地语言对应的属性文件,这就解释了为什么context.getMessage("hi", null, Locale.其次,refresh方法中还会调用initMessageSource方法,创建MessageSource对象。messages.properties:内容为空。
2024-04-16 20:10:04 418
原创 SpringMVC源码分析(十)--消息转换器
由于MediaType中可能存在通配符,因此需要判断能否匹配,例如text/*能匹配text/plain、text/html等,application/*+xml匹配application/soap+xml等。MappingJackson2HttpMessageConverter支持application/json及application/*+json,是最为常用的消息转换器。2)从HttpInputMessage中读取数据。1)将响应数据从对象转换为JSON格式。2)将请求数据从对象转换为JSON格式。
2024-04-08 19:33:05 495
原创 SpringMVC源码分析(五)--RouterFunctionMapping
本文主要介绍了RouterFunctionMapping的作用及原理
2024-03-23 21:18:52 943 1
原创 SpringMVC源码分析(四)--BeanNameUrlHandlerMapping
本文主要介绍了BeanNameUrlHandlerMapping的作用及原理
2024-03-23 11:33:46 906 1
原创 SpringMVC源码分析(三)--RequestMappingHandlerMapping
本文主要介绍了RequestMappingHandlerMapping的作用及其原理
2024-03-22 19:57:03 1784 1
原创 SPI机制浅谈
由于ServiceLoader位于rt.jar中,因此该类是被BootStrapClassLoader加载的,而ServiceLoader需要加载我们自定义的类,而BootStrapClassLoader是加载不了类路径下定义的类的,所以默认情况下,源码中通过。SPI机制的实现方式是,在配置文件中定义好某个接口的实现类,然后根据接口名找到配置文件中的实现类名,从而加载这个实现类。获取了线程上线文类加载器,一般为AppClassLoader,使用线程上线文类加载器就能够加载我们的实现类了。
2024-03-15 20:19:48 401 2
原创 Java学习--Object类
Object类1.registerNativesregisterNatives方法在静态代码块中使用,作用是将本类中除getClass方法以外的其他native修饰的本地方法注册到JVM中,Object类中的本地方法有:clone(),hashCode(),notify(),notifyAll(),wait()。// 注册本类中所有的本地方法private static native void registerNatives(); static { registerNatives(
2020-12-06 20:15:37 115
原创 数据结构学习--希尔排序
希尔排序 算法描述:希尔排序是插入排序的一种改进,主要是为了解决当较小的数据大都出现在数组后面时导致的移动次数明显增多的问题,思想是使用一个不断缩小的增量gap将数组元素分组,在每个分组内部先进行插入排序,当gap减少到1时整个数组元素分在一组,最后进行一次插入排序,整个排序过程结束。 算法时间复杂度:最好情况:当数据已经排好序的情况下:O(N^1.3);最坏情况:O(N^2);平均情况:O(NlogN) 算法空间复杂度:O(1) 算法...
2020-11-20 00:00:21 8353 5
原创 数据结构学习--插入排序
插入排序 算法描述:插入排序的思想是假设待排序元素前面的元素已经是排好序的状态,然后从右至左找到该元素插入的位置,在寻找插入点的过程中将该元素前面的元素逐个平移到后一个位置,避免了交换。 算法时间复杂度:最好情况:当数据以及排好序的情况下:O(N);最坏情况:O(N^2);平均情况:O(N^2) 算法空间复杂度:O(1) 算法稳定性:算法不存在前面元素与后面元素的交换,采用逐个平移的方式,因此该算法是稳定的。 算法实现...
2020-11-15 21:06:39 183
原创 数据结构学习--选择排序
选择排序 算法描述:选择排序的思想是初始化最小索引为0,每趟遍历选出最小的元素与最小索引的值进行交换,然后是最小索引加1,第二趟遍历出剩下元素中最小的元素,继续与当前索引的元素交换,依次类推,直到所有元素排列完成。相比于冒泡排序,选择排序的优点在于每次遍历只需要交换1次。 算法时间复杂度:最好情况:O(N^2);最坏情况:O(N^2);平均情况:O(N^2) 算法空间复杂度:O(1) 算法稳定性:由于选择排序会直接将前面的元素与后面较小...
2020-11-15 18:00:01 111
原创 数据结构学习--冒泡排序
冒泡排序 算法描述:冒泡排序的思想是在每趟交换的过程,比较相邻的两个元素,将值大的放在右边,即将当前比较过程中的最大值移动到右边,然后将比较过程的最大索引减1,继续第二趟排序,将剩余元素中的最大值移动到右边,依次类推,直到发现有一趟比较过程中没有发生交换,则说明数组已经排好序了。 算法时间复杂度:最好情况:当数组已经是排好序的情况下,时间复杂度O(N);最坏情况:O(N^2);平均情况:O(N^2) 算法稳定性:由于冒泡排序可以保证数组左边的值必须大于右...
2020-11-15 16:24:13 124
原创 数据结构学习--稀疏数组
稀疏数组 当二维数组中的有效数据较小时,为了减少保存该数组所占用的内存空间,通常将原始数组转换为稀疏数组进行存储,一般流程为:二维数组->稀疏数组->序列化到硬盘->反序列化到内存->读取稀疏数组->读取二维数组。 二维数组转稀疏数组的过程: 1.遍历原始二维数组,得到有效数据的个数sum; 2.根据sum创建稀疏数组sparseArr,该稀疏数组有sum+1行,3列,其中第一行记录原始数组的大小和有效值个数,从第二行开始每列记录该数...
2020-11-14 20:55:20 119
原创 JDK源码阅读环境搭建详细步骤
JDK源码阅读环境搭建详细步骤1.在Oracle官网下载JDK安装包,推荐JDK8或JDK11,这两个版本是LTS(长期支持)的版本,下载完成后安装,安装完成后再jdk目录中有一个src.zip的源码包。官网地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html。2.在IDEA中新建一个工程jdk_source,在该级目录下新建一个目录jdksrc,将源码包src.zip移动到该目录下,并解压,解压完成后
2020-11-09 20:25:33 432
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人