
java
文章平均质量分 81
fei1234456
这个作者很懒,什么都没留下…
展开
-
HashMap扩容时(resize方法)链表中节点处理细节(e.hash & oldCap) == 0算法推导
3. (2oldCap -1)=2 ^ 4-1=01111,其二进制位数比oldCap多一位,但多的这一位是0,其余都是1(其低三位肯定也是1,其从左到右数的第4位为1);0,若想要e.hash&oldCap的结果不为0,则e.hash的二进制形式中与对应oldCap的二进制的1的位置一定不为0,其他位置的可以随意,这样即可保证结果不为0;0,若想要e.hash&oldCap的结果为0,则e.hash的二进制形式中与对应oldCap的二进制的1的位置一定为0,其他位置的可以随意,这样即可保证结果为0;转载 2023-08-26 21:44:15 · 1196 阅读 · 0 评论 -
Spring 系列之 Spring 源码笔记:bean 的加载-下【十一】
Spring 中不但提供了对于初始化方法的扩展入口,同样也提供了销毁方法的扩展入口。原创 2021-07-24 10:14:38 · 443 阅读 · 0 评论 -
Spring 系列之 Spring 源码笔记:bean 的加载-中【十】
循环依赖就是循环引用,就是两个或多个 bean 相互之间的持有对方,比如 CircleA 引用 CircleB,CircleB 引用 CircleC,CircleC 引用 CircleA,则他们最终反映为一个环。此处不是循环调用,循环调用是方法之间的环调用。循环调用是无法解决的,除非有终结条件,否则就是死循环,最终导致内存溢出错误。原创 2021-06-15 23:55:01 · 449 阅读 · 2 评论 -
Spring 系列之 Spring 源码笔记:bean 的加载-上【九】
经过前面的分析,完成了对 XML 配置文件的解析,接下来会面临更大的挑战,就是对 bean 加载的探索。bean 加载的功能实现远比 bean 的解析要复杂的多,同样,以先看下实现代码:仅从代码量上就能看出 bean 的加载经历了一个相当复杂的过程,其中涉及各种各样的考虑。对于加载过程中所涉及的步骤在代码中已经进行了详细地注释,其中最重要的是步骤8,针对不同 scope 进行 bean 的创建,你会看到各种常用的 Spring 特性在这里的实现。下面的图反映了整个过程:fill:#333;123。原创 2021-06-02 18:41:29 · 603 阅读 · 2 评论 -
Spring 系列之 Spring 源码笔记:解析自定义标签【八】
在很多情况下,需要为系统提供可配置化支持,简单的做法可以直接基于 Spring 的标准 bean 来配置,但配置较为复杂或者需要更多丰富控制的时候,会显得非常笨拙。一般的做法会使用原生态的方式去解析定义好的 XML 文件,然后转化为配置对象。这种方式当然可以解决所有问题,但是实现起来比较繁琐,特别是在配置非常复杂的时候,解析工作是一个不得不考虑的负担。原创 2021-05-30 22:32:07 · 550 阅读 · 3 评论 -
Spring 系列之 Spring 源码笔记:解析默认标签-下【七】
到这里已经完成了分析默认标签的解析与提取过程,因为涉及的内容太多,可以已经忘记了从哪个函数开始的,再次回顾下默认标签解析函数的起始函数:前面已经用了大量的篇幅分析 BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);这行代码了,下面要进行 bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);原创 2021-05-20 15:58:56 · 244 阅读 · 1 评论 -
Spring 系列之 Spring 源码笔记:解析默认标签-中【六】
到这里就完成了对 XML 文档到 GenericBeanDefinition 的转换,也就是说,XML 中所有的配置都可以在 GenericBeanDefinition 的实例类中找到对应的配置。GenericBeanDefinition 只是子类实现,而大部分的通用属性都保存在了 AbstractBeanDefinition 中。下面看下 AbstractBeanDefinition 的属性来回顾下都解析了哪些对应的配置。/**// 这里省略了静态变量以及 final 常量 /**原创 2021-05-19 23:53:51 · 578 阅读 · 3 评论 -
Spring 系列之 Spring 源码笔记:解析默认标签-上【五】
接上篇文章。原创 2021-05-15 18:58:07 · 312 阅读 · 3 评论 -
Spring 系列之 Spring 源码笔记:容器的基本实现-下【四】
对于解析一个 XML,SAX 首先读取该 XML 文档上的声明,根据声明去寻找相应的 DTD 定义,以便对文档进行一个验证。默认的寻找规则,即通过网络(实际上就是生命的 DTD 的 URI 地址)来下载相应的 DTD 声明,并进行认证。下载的过程是一个漫长的过程,而且当网络中断或者不可用时,这里会报错,就是因为相应的 DTD 声明没有被找到。原创 2021-05-12 18:34:37 · 274 阅读 · 0 评论 -
Spring 系列之 Spring 源码笔记:容器的基本实现-中【三】
this.reader.loadBeanDefinitions(resource) 时序图:XmlBeanFactoryXmlBeanDefinitionReaderEncodedResourceResourceInputSourceloadBeanDefinitions(resource)1new EncodedResource(resource)2encodedResource:EncodedResource3loadBeanDefinitions(encodedResource)4getResourc原创 2021-04-28 23:55:28 · 299 阅读 · 0 评论 -
Spring 系列之 Spring 源码笔记:容器的基本实现-上【二】
XmlBeanFactory 继承 DefaultListableBeanFactory,而DefaultListableBeanFactory 是整个 bean 加载的核心部分,是 Spring 注册及加载 bean 的默认实现,DefaultListableBeanFactory 继承了 AbstractAutowireCapableBeanFactory 并实现了 ConfigurableListableBeanFactory 以及 BeanDefinitionRegistry 接口。原创 2021-04-23 23:43:45 · 406 阅读 · 0 评论 -
Spring 系列之 Spring 源码笔记:整体架构和环境搭建【一】
Spring 是于 2003 年兴起的一个轻量级 Java 开源框架,主要为了解决企业应用开发的复杂性,它使用基本的 JavaBean来完成以前只可能由 EJB 完成的事情。Sping 适用于一切 Java 应用。原创 2021-04-22 18:31:30 · 379 阅读 · 1 评论 -
项目实战系列之以压缩包的方式批量下载文件【三】
公司项目里有个需求,需要以压缩包的方式批量下载文件。前几天开发完成功能后,一直没时间总结,这里做个总结,希望可以帮到别的朋友。先贴下代码,如下:package cn.deepcap.common.utils;import cn.deepcap.common.exception.PlatformAlertException;import cn.deepcap.common.support.nas.FileStorageUtils;import lombok.extern.slf4j.Slf4j;原创 2021-04-16 16:04:44 · 569 阅读 · 0 评论 -
项目实战系列之swagger在线文档无法访问的一次踩坑记【二】
目前公司用的swagger在线文档,可是昨天我更新代码后,文档就打不开了,访问的时候后台报错,下面上图:开始也不知道是为什么,以为项目哪个地方有了问题,上厕所的时候,问了一个同事,他那居然可以,由于着急调试接口,就用postman测了一下,今天来上班发现还是不行,然后我就打断点跟了下代码:这里需要用异常断点调试,不然swagger会拦截项目里写了swagger的注解,如图:根据description找到对应的位置:因为在我平时的写法中,没有参数名后面用中括号的,而且这里是Delete请求方原创 2021-04-08 15:00:23 · 3179 阅读 · 0 评论 -
idea使用Gradle构建Spring源码
最近在研究spring源码,所以需要使用idea构建spring源码,构建过程遇到了各种坑,自己一边网上搜索和进行各种尝试,最后终于构建成功了,所以写下这篇博客记录,希望能帮助别人。1. 版本问题首先要解决的就是IDEA、JDK、Gradle、Kotlin问题。每一版的IDEA都有关于gradle和kotlin版本的限制,可以通过idea官网查看kotlin版本的限制,而关于gradle的限制(最低版本)如图所示(我这里用的2018.1版本的idea):gradle 和 kotlin 存在版.原创 2021-01-14 15:01:46 · 1133 阅读 · 0 评论 -
项目实战系列之解决Mybatis-plus利用collection查询一对多分页数据的Bug【一】
今天开发一个分页功能的时候,前端找我说数据不对。自己测试了一下,果然有问题。请求参数如下:相应结果如下(字段太多,删除了一些非关键字段):total是总记录数的意思,有4条,但是结果只有3条。网上搜索一番,定位到问题所在,这个是mybatis-plus关于分页的一个bug,我这里的collection写法如下:需要改一下collection的写法,分成两次查就可以了:说明:column是关联的id,意思就是根据哪个字段来查询关联表的字段;另外需要删除原来写法下一个select语句中col原创 2020-10-20 17:04:47 · 6817 阅读 · 0 评论 -
项目实战系列【总】
1.解决Mybatis-plus利用collection查询一对多分页数据的Bug2.swagger在线文档无法访问的一次踩坑记3.以压缩包的方式批量下载文件【项目实战总结】原创 2023-07-14 11:19:28 · 1197 阅读 · 0 评论 -
Linux安装tomcat8以及设置开机自启并且解决访问Manager App报403错误(安装包方式)
1. 安装tomcat8首先去官网下载安装包,官网地址:https://tomcat.apache.org/download-80.cgi,我这里下载的是:然后在/usr/local下创建tomcat文件夹:然后把安装包上传到该文件夹下,并解压:修改/etc/profile配置文件:添加如下内容:保存退出后使配置文件生效,然后进入tomcat的bin目录:启动tomcat:出现Tomcat started 说明启动成功了。但是开机后还需要手动启动,可以参考这篇文章设置开机自启原创 2020-07-09 14:56:16 · 370 阅读 · 0 评论 -
VMware安装CentOS7使用NAT模式进行上网配置,只需四步!
VMware安装CentOS7后是不能进行上网的,VMware默认选用的是NAT模式。1. 首先配置虚拟网络编辑器然后点击虚拟网络编辑器,出现如下弹窗:点击NAT设置,出现弹窗:2. 配置宿主VMnet8网卡我这里用的以太网,以以太网举例,首先右键以太网选择属性,在如下弹窗中选择VMnet8:然后右键设置VMnet8的IPV4属性:说明:IP地址与虚拟网关要在同个网段(如:192.168.204.100)网关:虚拟网关的地址(如:192.168.204.2)子网掩码:与虚原创 2020-07-07 14:44:49 · 7005 阅读 · 0 评论 -
关于MyBatis-Plus 自动填充处理器的坑
公司持久层框架使用的是Mybatis增强版:Mybatis-Plus,再一次做更新操作时,报了一个错误,由于隔得时间太久,代码也已经进行过改动,所以只有采用其它方式重现一下。问题再现首先新建一个表,很简单没什么说的:新建一个实体类:package com.aecc.smart.fire.server.entity;import com.baomidou.mybatisplus.annotations.TableField;import com.baomidou.mybatisplus.ann原创 2020-07-02 18:12:05 · 1710 阅读 · 2 评论 -
idea实用插件Free MyBatis plugin、Maven Helper、GsonFormat和快速生成maven依赖技巧
1. Free MyBatis plugin这个插件主要实现了mapper和xml的快速跳转,不用每次查找sql的时候全局搜索了。安装过程不多说,这个插件介绍如下:常用的就是第二个功能:快速从xml代码跳转到mapper文件和从mapper文件跳转到xml代码。如图所示,点击箭头即可实现跳转:2. Maven Helper这个插件主要用来解决maven冲突插件介绍如下:安装完成后,打开pom.xml文件,会多出一个Dependency Analyzer选项卡:点击后界面如下:原创 2020-06-30 16:47:06 · 1480 阅读 · 0 评论 -
Spring/SpringBoot系列之SpringBoot集成ShardingSphere实现分库分表实战【二十四】
1. 前言去年开发一个项目的时候,因为系统的核心数据是定时从外界发送过来的,数据量比较大,后来很快单表就达到了千万级别,这就需要分库分表,最后选择了ShardingSphere,原因就是比较容易上手。2. Sharding JDBC简介官网地址:https://shardingsphere.apache.org/如上图所示,当前版本是4.x,并且官网支持中文阅读。点击文档下拉4.x版本:简介如下:ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sha原创 2020-06-25 22:51:00 · 3388 阅读 · 1 评论 -
Spring/SpringBoot系列之@Configuration详解【十九】
现在大部分的Spring项目都采用了基于注解的配置,使用@Configuration 标记类作为配置类 替换 xml配置文件。一行简单的注解就可以解决很多事情。但是,其实每一个注解背后都有很多值得学习和思考的内容。比如:@Configuration有什么用?@Configuration和XML有什么区别?哪种好?@Autowired 、 @Inject、@Resource 之间有什么区别?@Value、@PropertySource 和 @Configuration?Spring如何处理带@Co原创 2020-06-22 18:04:45 · 51014 阅读 · 1 评论 -
Spring/SpringBoot系列之SpringBoot处理静态资源【十三】
进行web开发的时候,有很多静态资源,比如html、图片、css等。在前后端不分离的架构下,以前的传统的spring项目里面有一个webapp目录,只要把静态资源放到该目录下就可以直接访问,但是基于SpringBoot的工程没有这个目录,那应该如何处理?1. 通过流直接返回给前端在resources根目录下建立一个html的目录,然后创建一个测试的index.html,然后把index.html文件放在html目录下,并且规定访问路径为/index时访问静态资源index.html,实现代码:pa.原创 2020-06-17 11:54:54 · 2653 阅读 · 0 评论 -
Spring/SpringBoot系列之SpringBoot内嵌的Tomcat是如何启动的【十二】
1. 前言因为SpringBoot 内置了Tomcat容器,所以可以把 web 程序打成 jar 包,直接启动,而且在开发中也不需要像传统Spring项目那样,需要把项目添加到Tomcat中进行启动。不得不说,Springboot确实在方方面面提高了开发效率。2. 从 Main 方法说起SpringBoot 项目有一个启动类,启动类里有一个 main 方法用来启动整个应用:run()方法调用链:SpringApplication.run(DemoApplication.class, args原创 2020-06-16 17:59:16 · 2218 阅读 · 0 评论 -
Spring/SpringBoot系列之SpringBoot自定义starter实战【十一】
阅读本文前,推荐阅读:Spring/SpringBoot系列之SpringBoot 自动配置原理【十】SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目。除了官方已有的starter,也可以根据规则自定义自己的starter项目。而 Starter项目的核心就是条件注解 @Conditional,当 classpath 下存在某一个 Class 时,某个配置才会生效。下面来进行实战:1. 创建starter项目该操作共分为7步:创建一个maven项目;导入依赖sp原创 2020-06-16 15:23:59 · 808 阅读 · 0 评论 -
Spring/SpringBoot系列之SpringBoot 自动配置原理【十】
阅读本文前,最好先阅读:Spring/SpringBoot系列之SpringBoot 源码常用注解【九】1. SpringBoot 启动过程在SpringBoot源码中以下四个接口的子类的方法经常被调用:ApplicationContextInitializerApplicationRunnerCommandLineRunnerSpringApplicationRunListener下面开始分析源码,先从 SpringBoot 的启动类的 run() 方法开始看,以下是调用链:Sp原创 2020-06-12 18:02:37 · 374 阅读 · 0 评论 -
Spring系列【总】
Spring 系列之 Spring 整体架构和环境搭建【一】Spring 系列之 Spring 源码笔记:容器的基本实现-上【二】Spring 系列之 Spring 源码笔记:容器的基本实现-中【三】Spring 系列之 Spring 源码笔记:容器的基本实现-下【四】Spring 系列之 Spring 源码笔记:解析默认标签-上【五】Spring 系列之 Spring 源码笔记:解析默认标签-中【六】Spring 系列之 Spring 源码笔记:解析默认标签-下【七】Spring 系列之原创 2023-07-14 11:19:02 · 1799 阅读 · 1 评论